Ответ
В Django media-файлы — это пользовательский контент, загружаемый во время работы приложения (например, аватары пользователей, фотографии к товарам). Они хранятся в файловой системе и их содержимое может меняться.
Ключевое отличие от static-файлов:
STATIC: Файлы, необходимые для отображения сайта, которые не меняются в процессе его работы. Они являются частью кодовой базы проекта (CSS, JavaScript, иконки, фоновые изображения).MEDIA: Файлы, создаваемые пользователями. Они не являются частью проекта и должны храниться отдельно.
Настройка
Для работы с media-файлами в settings.py необходимо определить две константы:
# settings.py
# URL-префикс для доступа к файлам из браузера
MEDIA_URL = '/media/'
# Абсолютный путь в файловой системе, где будут храниться загруженные файлы
MEDIA_ROOT = BASE_DIR / 'media'
Чтобы Django мог отдавать эти файлы в режиме разработки (DEBUG=True), необходимо добавить специальный маршрут в корневой urls.py:
# urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... ваши основные URL
]
# Это правило работает только в режиме DEBUG
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Важно: В production-окружении раздачу media-файлов следует доверять веб-серверу (например, Nginx) или облачному хранилищу (S3), а не Django.
Ответ 18+ 🔞
А, слушай, про эти ваши медиа-файлы в Джанге! Это ж та самая движуха, которую юзеры сами на сайт тащат — аватарки, фотки товаров, всякую такую хуйню. Они живут своей жизнью в файловой системе, меняются, плодятся — полный пиздец, в общем.
А вот статика — это другое, блядь! Это как твой неизменный костюм: CSS, JS, иконки — всё, что ты сам написал и без чего сайт — просто голая жопа. Статика — часть проекта, а медиа — это уже пользовательский бардак.
Ну, настраиваем, сука
Чтобы этот цирк заработал, в settings.py надо прописать две простые, но охуенно важные штуки:
# settings.py
# Это типа адрес, по которому браузер будет эти файлы ловить
MEDIA_URL = '/media/'
# А это — реальная папка на твоём компе или сервере, куда всё это добро будет падать
MEDIA_ROOT = BASE_DIR / 'media'
Дальше, чтобы на локалке всё летало (когда DEBUG=True), в корневой urls.py добавляем такую магию:
# urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... все твои обычные урлы
]
# И вот этот волшебный пиздец, который работает ТОЛЬКО в режиме отладки!
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
И главное, запомни, как "Отче наш", ёпта: на боевом сервере (DEBUG=False) эту раздачу файлов НИ В КОЕМ СЛУЧАЕ не оставляй на Джанге! Это как доверить медведю сервировку стола — всё разъебёт. Отдай эту почетную обязанность веб-серверу (типа Nginx) или, что ещё лучше, какому-нибудь облачному хранилищу вроде S3. А Джанга пусть своим делом занимается — логикой, а не раздачей картинок, блядь.