Django Media Files Not Found (404) on Render Deploy
У меня проблемы с обслуживанием медиафайлов в моем Django-приложении, развернутом на Render. Медиафайлы создаются и хранятся (я думаю) на сервере правильно, но обращение к ним через браузер приводит к 404 ошибке. В моей локальной среде разработки все работает нормально.
Настройка проекта:
settings.py
:
import os
from pathlib import Path
import environ
import dj_database_url
# Initialize environment variables
env = environ.Env(
DEBUG=(bool, False)
)
# Read .env file
environ.Env.read_env(os.path.join(Path(__file__).resolve().parent.parent, '.env'))
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Static and Media files
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = '/var/data/media'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# Static files finders
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
# Ensure static files are served using Whitenoise
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'allauth.account.middleware.AccountMiddleware',
]
# Whitenoise storage
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# Other settings...
# URL configuration
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Существование файла:
Я убедился, что медиафайлы создаются на сервере:
render@srv-cpoif12ju9rs738p174g-5f676c9f8c-bwxhd:~/project/src$ ls -l /var/data/media/subtitles/U-sEgjJRHcM_subtitles.json
-rwxr-xr-x 1 render render 14995 Jun 22 14:53 /var/data/media/subtitles/U-sEgjJRHcM_subtitles.json
URL Patterns:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.auth.views import LoginView, LogoutView
from django.views.generic import TemplateView
from accounts import views as account_views
from subplayer import views as subplayer_views
from allauth.account.views import LoginView, LogoutView, SignupView
from allauth.account.views import PasswordResetView
urlpatterns = [
path('admin/', admin.site.urls),
...
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Выпуск:
Несмотря на то, что файл существует на сервере, обращение к нему по URL приводит к ошибке 404.
Например: https://xxx.onrender.com/media/subtitles/U-sEgjJRHcM_subtitles.json
Что я пробовал:
- Убедились в существовании файла на сервере.
- Проверил и перепроверил настройки
MEDIA_URL
иMEDIA_ROOT
. - Убедились, что URL-адреса настроены правильно.
- Разрешения кажутся правильными с
chmod -R 755 /var/data/media
.
Дополнительная информация:
- Используем Render для развертывания.
- Создан постоянный диск, смонтированный по адресу
/var/data
.
Любая помощь в решении этой проблемы будет очень признательна!
В продакшене вам понадобится что-то вроде nginx, чтобы указать серверу, где искать статические файлы. В вашем url.py есть последняя строка, которая указывает Django на локальный сервер медиафайлов, в Production вы хотите, чтобы это делал не Django, а nginx.
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Это короткое руководство от DigitalOcean о том, как добавить nginx в ваше приложение, они используют его только для статических файлов. Вы можете просто скопировать часть /static/
и сделать то же самое для /media/
пути.