Django STATIC_URL с полным доменом разбивает статические активы локально
При локальной работе над проектом Django, который использует статические файлы и бэкенд статических файлов по умолчанию, я сталкиваюсь с проблемой, когда хочу получить полные абсолютные ссылки на статические файлы вместо только пути.
Мои настройки:
DEBUG = True
BASE_DIR = Path(__file__).resolve().parent.parent
INSTALLED_APPS = ["django.contrib.staticfiles", ...]
STATIC_ROOT = BASE_DIR / "static_root"
STATIC_URL = "/static/"
MEDIA_ROOT = BASE_DIR / "media_root"
MEDIA_URL = "/media/"
STATICFILES_DIRS = (BASE_DIR / "static",)
STATICFILES_FINDERS = (
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
)
Все работает, CSS админки загружается, картинки работают и т.д. Но когда я получаю путь к файлу с таким кодом:
from django.contrib.staticfiles.storage import staticfiles_storage
static_path = staticfiles_storage.url("path_to_folder/some_file.jpg")
В результате получается относительный путь: /static/path_to_folder/some_file.jpg
. Это проблема, когда эти url используются из моего внешнего фронтенда: теперь он должен добавлять базовый url бэкенда ко всем статическим активам. Но если я хочу развернуть статические активы на S3, например, в продакшене, то я не должен предварять эти пути доменом бэкенда
Итак, я попытался изменить настройку STATIC_URL
на http://localhost:8000/static/
. Таким образом, полный url передается во фронтенд, но я мог бы легко изменить эту настройку в бэкенде в продакшене.
И вот тут-то и возникает проблема: когда я меняю STATIC_URL
на http://localhost:8000/static/
, ни один из моих статических файлов больше не работает, я просто получаю 404. Страница администратора также не работает из-за этого.
Короче говоря, как я могу использовать абсолютный STATIC_URL
в режиме локальной разработки с DEBUG=True
?
Нашел решение здесь: https://docs.djangoproject.com/en/4.1/ref/contrib/staticfiles/#django.contrib.staticfiles.views.serve.
Просто добавьте это в конец файла urls.py:
from django.conf import settings
from django.contrib.staticfiles import views
from django.urls import re_path
if settings.DEBUG:
urlpatterns += [
re_path(r'^static/(?P<path>.*)$', views.serve),
]
Тогда статические файлы снова будут работать даже с абсолютным URL в качестве параметра STATIC_URL.