想要提示浏览器保存csv使用pyramid.response.Response搜索线索,发现这里是一个链接 Django回答但我不能用它与金字塔wsgi我的代码看起来像这样:
from pyramid.response import Response
def get_list_names_emails(request):
session, env = request.db, request.client_env
response = Response(content_type='text/csv')
output = StringIO()
writer = csv.writer(output)
writer.writerow(['SomeName', 'SomeEmail', 'CompanyName])
csv_output = output.getvalue()
return csv_output
Run Code Online (Sandbox Code Playgroud)
Mar*_*ani 15
作为一种更简洁的方法,您可以注册渲染器.
在配置设置中,添加:
config.add_renderer(name='csv',
factory='mypackage.renderers.CSVRenderer')
Run Code Online (Sandbox Code Playgroud)
然后在mypackage/renderers.py:
class CSVRenderer(object):
def __init__(self, info):
pass
def __call__(self, value, system):
fout = StringIO.StringIO()
writer = csv.writer(fout, delimiter=';', quoting=csv.QUOTE_ALL)
writer.writerow(value['header'])
writer.writerows(value['rows'])
resp = system['request'].response
resp.content_type = 'text/csv'
resp.content_disposition = 'attachment;filename="report.csv"'
return fout.getvalue()
Run Code Online (Sandbox Code Playgroud)
之后,您可以使用渲染器修饰视图:
@view_config(..., renderer='csv')
def myview(self):
header = ['name', 'surname', 'address']
rows = [
(
row['name'],
row['surname'],
row['address'],
)
for row in query_rows(.....)
]
return {
'header': header,
'rows': rows
}
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是更好的可测试视图代码(您只需检查字典值,无需解析任何内容),您还可以向同一视图添加XLS或任何渲染器:
@view_config(..., renderer='xls')
@view_config(..., renderer='csv')
def myview(self):
...
Run Code Online (Sandbox Code Playgroud)
尝试添加内容处理:
response['Content-Disposition'] = 'attachment; filename="report.csv"'
Run Code Online (Sandbox Code Playgroud)