У меня есть контроллер Pylons с действием serialize , возвращающим content_type=text/csv
. Мне бы хотелось, чтобы ответ на действие назывался на основе входного патаметра, то есть для следующего маршрута полученный csv-файл должен иметь имя {id}.csv
: /app/PROD/serialize
=> PROD.csv
(чтобы пользователь мог открыть файл в 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'
[неудачно пробовал оба :(]
Я что-то упускаю здесь очевидное?
Приветствия
UPDATE:
Благодаря ebo Мне удалось исправить content-disposition
. В следующий раз лучше прочитать спецификации W3C;)