Медиа-файл Django не используется в производстве, но используется в разработке (localhost)?
Медиа-файл Django работает в разработке, но не в производстве. Какое бы изображение я ни загружал через администратора Django, оно показывается на веб-сайте на локальном хосте, но когда я живу на своем сайте в цифровом океане, оно не отображается. Как решить эту проблему может кто-нибудь сказать? URL моего сайта - http://139.59.56.161/ нажмите на книжное тестовое меню
1 ответ
Воскрешение давно мертвого вопроса, и это было все, что я мог найти, чтобы помочь мне здесь. Запись моего ответа для потомков. Моя "производственная" среда использует nginx в качестве обратного прокси-сервера перед uwsgi, где размещается мое приложение django. Решение состоит в том, что Django просто не обслуживает файлы в Production; вместо этого вы должны настроить свой веб-сервер для этого.
Джанго немного бесполезен, когда говорит о статических файлах, а затем говорит "медиа-файлы: то же самое".
Поэтому я считаю, что лучше всего заранее отлавливать файловые запросы, в моем случае на сервере nginx, чтобы уменьшить двойную обработку, а ваш интерфейсный веб-сервер наиболее оптимизирован для этой работы.
Для этого: в блоке определения сервера в вашем /etc/nginx/sites-available/[site.conf] определите webroot, каталог в файловой системе вашего сервера, который охватывает все с помощью объявления "root [dir]".
server {
listen 80;
server_name example.com www.example.com;
root /srv/;
Следующий блок сообщает nginx об отправке всего трафика на службу uwsgi, работающую под управлением django - я поднял это как болюс из примера, возможно, на digitalocean.com.
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/mysite6.sock;
}
Теперь вот биты, которые нам нужны для обслуживания файлов, когда они запрашиваются. try_files пытается обслужить $uri, а затем $uri/, и было бы неплохо поместить файл типа 'resource_not_found.html' в /srv и установить его как последний запасной вариант для try_files, чтобы пользователь знал, что эта часть имеет был непреднамеренно оставлен пустым.
location /static/ {
try_files $uri $uri/ ;
}
location /media/ {
try_files $uri $uri/ ;
}
}
На этом наш серверный блок для http завершен, поэтому добавлено дополнительное закрытие "}".
В качестве альтернативы, вы можете заставить uwsgi сделать это, установив "static-map" или "static-map2". "static-map" "съедает" отображенную часть URL, тогда как static-map2 добавляет ее.
static-map /files=/srv/files
означает, что запрос на /files/funny.gif будет обслуживать /srv/files/files.gif.
static-map2 /files=/srv
будет делать то же самое, потому что он примет запрос на /files/funny.gif и ищет /srv/files/funny.gif. Согласно документам uwsgi, вы можете создать столько сопоставлений, сколько захотите, даже к одному и тому же uri, и они будут проверяться в порядке появления. Черт, я только сейчас, наконец, нашел документы для открытого исходного кода nginx.