Pylons:响应重命名?有没有更好的办法?

时间:2010-02-17 23:29:31

标签: python pylons response wsgi webob

我有一个Pylons控制器,其动作叫做序列化,返回content_type=text/csv。我想根据输入的patameter命名要响应的操作的响应,即对于以下路由,生成的csv文件应该命名为{id}.csv/app/PROD/serialize => PROD.csv(因此用户可以直接通过webbrowser在Excel中使用正确的名称打开文件)

map.connect('/app/{id}/serialize',controller = 'csvproducer',action='serialize')

我试图设置不同的HTTP标头和webob的响应对象的属性,没有运气。但是,我想出了一个解决方法,只需向控制器添加一个新动作,并动态地将原始动作重定向到该新动作,即:

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规范;)

1 个答案:

答案 0 :(得分:2)

您应该能够在response object上设置内容处置标头。

如果你已经尝试过,它可能没有用,因为http标准说引号应该用双引号来完成。