Я должен возвратить css файлы и js файлы согласно определенной логике. Очевидно, статическая подача не выполняет то, в чем я нуждаюсь. У меня есть представление, метод рендеринга которого использует логику для нахождения надлежащего файла, но тогда я должен возвратить его. Технически, я могу просто считать файл и наполнить его в объект HttpResponse с надлежащим типом пантомимы, но я задавался вопросом, была ли лучшая стратегия. (как fpassthru () в php)
Какое программное обеспечение веб-сервера вы используете?
По крайней мере, для 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
Передайте итератор (например, результат open ()
) конструктору HttpResponse
.
Почему бы не вернуть HttpResponseRedirect
на местоположение правильного статического файла?
Использование django для обслуживания статического контента должно быть расточительным (не говоря уже о том, что это на несколько порядков медленнее).
Я бы предпочел преобразовать представление в контекстный процессор и использовать переменные в шаблонах, чтобы найти, какие блоки включить.
Вот что я использовал:
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