У меня есть контроллер 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)
Вышеупомянутые установки работает отлично, однако, есть ли лучший способ/slicker/neater? В идеале я не хотел бы перенаправлять запрос; Вместо этого я хотел бы либо переименовать location
или установить content-disposition: attachment; filename='XXX.csv'
[безуспешно пытались как :(]
я упускаю что-то очевидное здесь
Приветствия
UPDATE: Благодаря Ebo Мне удалось сделать исправление content-disposition
. Должны лучше читать спецификации W3C в следующий раз;)
Приветствия, пятно на, вот оно! Отсутствуют двойные кавычки. Штопать! Я потратил слишком много времени на кодирование Python> :) – Dave