Как возвратить статические файлы, проходящие через представление в django?

Я должен возвратить css файлы и js файлы согласно определенной логике. Очевидно, статическая подача не выполняет то, в чем я нуждаюсь. У меня есть представление, метод рендеринга которого использует логику для нахождения надлежащего файла, но тогда я должен возвратить его. Технически, я могу просто считать файл и наполнить его в объект HttpResponse с надлежащим типом пантомимы, но я задавался вопросом, была ли лучшая стратегия. (как fpassthru () в php)

19
задан Stefano Borini 19 February 2010 в 06:36
поделиться

5 ответов

Какое программное обеспечение веб-сервера вы используете?

По крайней мере, для Apache и NginX существует модуль, позволяющий использовать HTTP-заголовок X-SendFile. На сайте NginX говорится, что Lighty тоже может это делать.

В вашем представлении-обертке:

...

abspath = '/most_secret_directory_on_the_whole_filesystem/protected_filename.css'

response = HttpResponse()
response['X-Sendfile'] = abspath

response['Content-Type'] = 'mimetype/submimetype'
# or let your webserver auto-inject such a header field
# after auto-recognition of mimetype based on filename extension

response['Content-Length'] = <filesize>
# can probably be left out if you don't want to hassle with getting it off disk.
# oh, and:
# if the file is stored via a models.FileField, you just need myfilefield.size

response['Content-Disposition'] = 'attachment; filename=%s.css' \
    % 'whatever_public_filename_you_need_it_to_be'

return response

Затем вы можете подключить представление через http://mysite.com/url_path/to/serve_hidden_css_file/.

Вы можете использовать его в любое время, когда вам нужно что-то сделать с запрашиваемым файлом, который не должен быть напрямую доступен пользователям, например, ограничить доступ к нему, или подсчитать запросы к нему для статистики, или что-то еще.

Для Apache: http://tn123.ath.cx/mod_xsendfile/
For NginX: http://wiki.nginx.org/NginxXSendfile

10
ответ дан 30 November 2019 в 03:24
поделиться

Передайте итератор (например, результат open () ) конструктору HttpResponse .

1
ответ дан 30 November 2019 в 03:24
поделиться

Почему бы не вернуть HttpResponseRedirect на местоположение правильного статического файла?

1
ответ дан 30 November 2019 в 03:24
поделиться

Использование django для обслуживания статического контента должно быть расточительным (не говоря уже о том, что это на несколько порядков медленнее).

Я бы предпочел преобразовать представление в контекстный процессор и использовать переменные в шаблонах, чтобы найти, какие блоки включить.

-1
ответ дан 30 November 2019 в 03:24
поделиться

Вот что я использовал:

test_file = open('/home/poop/serve/test.pdf', 'rb')
response = HttpResponse(content=test_file)
response['Content-Type'] = 'application/pdf'
response['Content-Disposition'] = 'attachment; filename="%s.pdf"' \
                                  % 'whatever'
return response
22
ответ дан 30 November 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: