2010-02-17 3 views
0

У меня есть контроллер 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 в следующий раз;)

ответ

2

Вы должны быть в состоянии установить заголовок содержимого на response object.

Если вы уже пробовали это, возможно, оно не сработало, потому что в стандарте http говорится, что кавычки должны выполняться двойными кавычками.

+0

Приветствия, пятно на, вот оно! Отсутствуют двойные кавычки. Штопать! Я потратил слишком много времени на кодирование Python> :) – Dave

 Смежные вопросы

  • Нет связанных вопросов^_^