自定义渲染器¶
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
.
根据用例的需要重写响应的属性。我们在视图代码中实现这一方面,以使我们的自定义渲染器代码集中于任务。
最后,我们通过 headers
和 rows
到csv渲染器。
有关如何添加自定义渲染器的详细信息,请参见Pyramid文档的以下部分: