Django: отключить APPEND_SLASH для определенных URL - PullRequest
0 голосов
/ 16 марта 2012

У меня есть представление, которое защищает определенные конфиденциальные файлы от публичной загрузки, используя заголовок nginx 'X-Accel-Redirect. Мой URL выглядит так:

url(r'^dl/f/(?P<pk>\d+)/(?P<filename>[^/]+)$', 'file_download.views.download', name='download-filename'),

pk - это первичный ключ файлового объекта в базе данных, filename - это имя файла, которое соответствует чему угодно, кроме косой черты. Это в основном там, чтобы браузер знал имя файла на тот случай, если пользователь захочет его сохранить. Обратите внимание, что нет косой черты.

Когда я открываю соответствующий URL в браузере, Django, тем не менее, перенаправляет его на тот же URL с добавленной косой чертой. Файл отображается в браузере (это PDF), но если я хочу сохранить его, браузер предлагает общий «download.pdf» вместо имени файла.

Я не хочу отключать APPEND_SLASH для общего случая, но могу ли я как-то обойти это для этого единственного случая?

/ edit: к сожалению, я не могу использовать заголовок Content-Disposition: attachment, поскольку все остальные файлы также обслуживаются без этого заголовка, и требуется согласованное поведение как для защищенных, так и незащищенных файлов.

1 Ответ

1 голос
/ 16 марта 2012

Я не знаю, где / если он находится в документации, но я считаю, что добавление расширения в URL предотвратит это поведение, поэтому вместо some-filename/ используйте some-filename.pdf (и соответственно измените urlpattern Конечно).

Однако я не совсем уверен в этом. Действительно, ваша основная проблема заключается в том, что имя загружаемого файла задано неправильно, и это можно исправить, не мешая URL-адресам тем или иным способом. Просто сохраните ответ, а не возвращайте его немедленно, а затем измените заголовок Content-Disposition:

response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'

UPDATE

Относительно двух пунктов в вашем комментарии:

  1. urlpattern может принимать расширение подстановочного знака \.\w{3,4}.

  2. 'attachment' - это то, что вызывает загрузку. 'inline' может использоваться для загрузки файла в браузере. Имя файла может быть указано в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...