自定义渲染器

Pyramid 支持自定义渲染器,与 default renderers 与 Pyramid 一起装运。

这里有一个基本的逗号分隔值(csv)渲染器,可以将csv文件输出到浏览器。将以下内容添加到 renderers.py

 1import csv
 2try:
 3    from StringIO import StringIO # python 2
 4except ImportError:
 5    from io import StringIO # python 3
 6
 7class CSVRenderer(object):
 8    def __init__(self, info):
 9        pass
10
11    def __call__(self, value, system):
12        """ Returns a plain CSV-encoded string with content-type
13        ``text/csv``. The content-type may be overridden by
14        setting ``request.response.content_type``."""
15
16        request = system.get('request')
17        if request is not None:
18            response = request.response
19            ct = response.content_type
20            if ct == response.default_content_type:
21                response.content_type = 'text/csv'
22
23        fout = StringIO()
24        writer = csv.writer(fout, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
25
26        writer.writerow(value.get('header', []))
27        writer.writerows(value.get('rows', []))
28
29        return fout.getvalue()

现在有了渲染器。我们在申请表上登记吧 Configurator

config.add_renderer('csv', 'myapp.renderers.CSVRenderer')

当然,修改点线以指向您决定的模块位置。要使用渲染器,请创建一个视图:

 1@view_config(route_name='data', renderer='csv')
 2def my_view(request):
 3   query = DBSession.query(table).all()
 4   header = ['First Name', 'Last Name']
 5   rows = [[item.first_name, item.last_name] for item in query]
 6
 7   # override attributes of response
 8   filename = 'report.csv'
 9   request.response.content_disposition = 'attachment;filename=' + filename
10
11   return {
12      'header': header,
13      'rows': rows,
14   }
15
16def main(global_config, **settings):
17    config = Configurator(settings=settings)
18    config.add_route('data', '/data')
19    config.scan()
20    return config.make_wsgi_app()

在中查询数据库 query 变量,建立 headers 并初始化 rows .

根据用例的需要重写响应的属性。我们在视图代码中实现这一方面,以使我们的自定义渲染器代码集中于任务。

最后,我们通过 headersrows 到csv渲染器。

有关如何添加自定义渲染器的详细信息,请参见Pyramid文档的以下部分: