Это ожидаемое поведение . Django не не обслуживает stati c файлы или мультимедийные файлы в производстве. Вы должны настроить nginx, и т.д. c. для обслуживания файлов.
Как указано в Stati c представление разработки файла раздел документации :
Это представление будет работать, только если DEBUG
равно True
.
Это потому, что это представление крайне неэффективно и, вероятно, небезопасно . Это предназначено только для локальной разработки, и никогда не следует использовать в производстве .
Обычно вы должны настроить nginx
, apache
веб-сервер для обслуживания stati c файлы. Эти веб-серверы, вероятно, более эффективны и имеют более специализированные инструменты для обеспечения безопасности.
Django предлагает некоторые инструменты, которые помогут вам настроить файлы stati c, например, с помощью collectstatic
команда [Django -doc] для сбора stati c файлов в одном месте. В документации также описывается, как создать конфигурацию basi c для apache и nginx.
Также имеется package whitenoise
, если вы действительно хотите разрешить Django обслуживать файлы stati c в производстве, но как сказано в документации :
Разве не обслуживает файлы stati c из Python ужасно неэффективно?
Короткий ответ на этот вопрос: если вы заботитесь о производительности и эффективности, тогда вы должно быть с использованием WhiteNoise за CDN , например CloudFront. Если вы это сделаете, то из-за заголовков кеширования, которые отправляет WhiteNoise, подавляющее большинство запросов stati c будет обслуживаться непосредственно CDN, не затрагивая ваше приложение, поэтому на самом деле не имеет большого значения, насколько эффективен WhiteNoise. .
Тем не менее, WhiteNoise довольно эффективен. Поскольку он должен обслуживать только фиксированный набор файлов, он выполняет всю работу по поиску файлов и определению правильных заголовков заранее при инициализации. Затем запросы могут обслуживаться с помощью немногим более простого поиска в словаре, чтобы найти подходящий ответ. Кроме того, при использовании с gunicorn (и большинством других серверов WSGI) фактическое продвижение файла по сетевому интерфейсу выполняется очень эффективным системным вызовом sendfile
ядра, а не Python.