Как обслуживать медиафайлы в среде разработки django?

В моем файле settings.py: -

DEBUG = False
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

STATIC_URL = '/static/'
LOGIN_URL = '/login/'
MEDIA_URL = '/media/'

В моем файле urls.py: -

urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

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

"GET /media/profile_images/a_34.jpg HTTP/1.1" 404 103

a_34.png присутствует в /media/profile _images/

то почему он не отображается в браузере, и я получаю ошибку 404?

Ответ 1

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

Например

Если вы используете веб-сервер Apache в процессе производства, добавьте ниже конфигурацию виртуального хоста

Alias /media/ /path/to/media_file/

<Directory /path/to/media_file/>
Order deny,allow
Allow from all
</Directory>

Если вы используете Nginx, у вас будет такая же конфигурация.

Ответ 2

Джанго не рекомендует обслуживать медиафайлы на производстве с сервера. Используйте облачные сервисы, такие как amazon s3, для хранения медиафайлов. Посмотрите это Django doc serve media, затем укажите этот путь в MEDIA_URL.

Ответ 3

Вам необходимо настроить сервер для обслуживания статического содержимого при производстве. Когда только Debug is True, статический контент обслуживается Django. Поэтому вам нужно

1) Настройка сервера

2) Путь к серверу Point Server в каталог STATIC_ROOT

3) Запустите коллекцию команд django, чтобы собрать все статические файлы в STATIC_ROOT. Пожалуйста, обратитесь

https://docs.djangoproject.com/en/1.10/howto/static-files/

Ответ 4

Вы можете использовать S3 Amazon для статических и мультимедийных файлов. Это будет лучше.


Проблема с S3 Amazon

Создание ведра S3 появляется как часть файловой системы, имеет ужасную производительность и случайным образом выходит из строя. Когда мы копируем много файлов, может потребоваться 10, 15 или 20 минут для того, чтобы копирование завершило развертывание, потребуется много времени, когда им это не нужно. Если мы отправим их непосредственно в S3, то для выполнения одной и той же команды копирования потребуется около 1 минуты.

Решение

Подкласс S3BotoStorage дважды, один класс для статических файлов, а другой для медиафайлов. Это позволяет нам использовать разные ведра и подкаталоги для каждого типа. (см. custom_storage.py)

Настройки обновления

1. AWS_STORAGE_BUCKET_NAME  needs to be bucket to hold static files and media files
2. MEDIAFILES_BUCKET
3. MEDIAFILES_LOCATION
4.DEFAULT_FILE_STORAGE
5.STATICFILES_BUCKET
6.STATICFILES_LOCATION
This is the subdirectory under the S3 bucket for the app
7.STATIC_URL
8.STATICFILES_STORAGE

Создайте custom_storage.py с содержимым:

from django.utils.deconstruct import deconstructible
from storages.backends.s3boto import S3BotoStorage
from django.conf import settings

@deconstructible
class StaticS3Storage(S3BotoStorage):
   bucket_name = settings.STATICFILES_BUCKET
   location = settings.STATICFILES_LOCATION

@deconstructible
class MediaS3Storage(S3BotoStorage):
   bucket_name = settings.MEDIAFILES_BUCKET
   location = settings.MEDIAFILES_LOCATION

Пример settings.py.tmpl для настроек обновлений (как указано выше) на основе моего stack.json

MEDIAFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>'
MEDIAFILES_LOCATION = 'folder_name_for_media_files_in_bucket'
DEFAULT_FILE_STORAGE = 'custom_storage.MediaS3Storage'

# If we're not using our S3 backend storage we need to serve the media files via path
   if DEFAULT_FILE_STORAGE == "custom_storage.MediaS3Storage":
       MEDIA_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' %      (MEDIAFILES_BUCKET, MEDIAFILES_LOCATION)
   else:
       MEDIA_URL = '/media/'

   STATICFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>'
   STATICFILES_LOCATION = 'folder_name_for_static_files_in_bucket'
   STATICFILES_STORAGE = '<%= @node["deploy_data"]["project_name"]["django_static_files_storage"] %>'

# If we're not using our S3 backend storage we need to serve the static files via path
   if STATICFILES_STORAGE == "custom_storage.StaticS3Storage":
       STATIC_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' % (STATICFILES_BUCKET, STATICFILES_LOCATION)
   else:
       STATIC_URL = '/static/'

загрузить статическую информацию из staticfiles Шаблон шаблона Django

Измените все использования {% load static%} в шаблонах до {% load static from staticfiles%}

"Статические" из статических файлов могут использовать разные обратные концы для файлов, включая конец задней части S3 или конец локального файла. Использование "load static" использует библиотеку тегов шаблонов Django, которая не обрабатывает разные обратные концы.

Используйте это в шаблонах при включении статического файла и после включения "static from staticfiles": {% static "путь/в/the/file.ext" %} Это будет определять полный путь к файлу, или если в S3 он вставляет полный URL-адрес в файл.

Пример

<link rel="stylesheet" type="text/css" href="{% load static from staticfiles %}{% static "css/style.css" %}">

Полезная информация

"django.contrib.staticfiles.storage.StaticFilesStorage" является файловой системой статических файлов Django по умолчанию

Ссылки

https://docs.djangoproject.com/en/1.9/howto/static-files/ https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/

Ответ 5

Для nginx это работает для меня со следующими строками конфигурации:

location /media {
    alias /home/ubuntu/speedy-net/media; # Change to your own media directory here.
    access_log off;
}

Также см. мой связанный вопрос о проверке кода.