Медиа-файл 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.

Уссги документы

Другие вопросы по тегам