Пилоны: ответ переименование? Есть ли способ лучше? - PullRequest
0 голосов
/ 18 февраля 2010

У меня есть контроллер 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;)

1 Ответ

2 голосов
/ 18 февраля 2010

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

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

...