我有一个 Pylons 控制器,其中包含一个名为serialize返回的操作content_type=text/csv
。我希望根据输入参数命名操作的响应,即对于以下路线,生成的 csv 文件应命名为{id}.csv
:/app/PROD/serialize
=> PROD.csv
(因此用户可以在 Excel 中直接通过正确名称打开文件)网页浏览器)
map.connect('/app/{id}/serialize',controller = 'csvproducer',action='serialize')
我尝试设置 webob 响应对象的不同 HTTP 标头和属性,但没有成功。但是,我通过简单地向控制器添加一个新操作并将原始操作动态重定向到该新操作来找到一种解决方法,即:
map.connect('/app/{id}/serialize',controller = 'csvproducer',action='serialize')
map.connect('/app/csv/{foo}',controller = 'csvproducer', action='tocsv')
控制器的片段:
def serialize(self,id):
try:
session['key'] = self.service.serialize(id) #produces csv content
session.save()
redirect_to(str("/app/csv/%s.csv" % id))
except Exception,e:
log.error(e)
abort(503)
def tocsv(self):
try:
csv = session.pop("rfa.enviornment.serialize")
except Exception,e:
log.error(e)
abort(503)
if csv:
response.content_type='text/csv'
response.status_int=200
response.write(csv)
else:
abort(404)
上面的设置工作得很好,但是,有没有更好/更流畅/更整洁的方法呢?理想情况下,我不想重定向请求;相反,我想重命名location
或设置content-disposition: attachment; filename='XXX.csv'
[ 均未成功尝试:( ]
我在这里遗漏了一些明显的东西吗?
干杯
更新:
感谢ebo,我已经设法解决了content-disposition
。下次最好阅读 W3C 规范;)