В Django нельзя обслуживать статические файлы, но можно обслуживать из медиафайлов
Django - это v5.1
Имеем вот такой settings.py:
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
INSTALLED_APPS = [
'main.apps.MainConfig',
'api.apps.ApiConfig',
'medialibrary.apps.MedialibraryConfig',
'blog.apps.BlogConfig',
'articles.apps.ArticlesConfig',
'photos.apps.PhotosConfig',
'drawings.apps.DrawingsConfig',
'content.apps.ContentConfig',
'app.apps.AppConfig',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'strawberry_django',
'imagefield',
'mdeditor',
'django_cleanup.apps.CleanupConfig',
]
Этот urls.py:
urlpatterns = [
path('graphql', include('api.urls')),
path('mdeditor/', include('mdeditor.urls')),
path('admin/', admin.site.urls),
path('', RedirectView.as_view(url=reverse_lazy('admin:index'))),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL,
document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Это переопределение admin/base.html:
{% extends 'admin/base.html' %}
{% load static %}
{% block extrahead %}
<link rel="shortcut icon" href="{% static 'favicon.ico' %}" />
{% endblock %}
Эта структура:
И он не обслуживает статические файлы из статической папки. Просто показывает 404. Но обслуживает статические файлы из папки media.
Я совершенно не представляю, где здесь может быть ошибка.
Я попытался создать абсолютно чистый новый проект и проделал те же настройки со STATIC без модификации urls.py, и результат тот же - favicon.ico из папки static не обслуживается.
На самом деле вам не нужно добавлять urlpatterns += static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
в urls.py
Проверьте, присутствует ли django.contrib.staticfiles
в установленных приложениях и запускаете ли вы его с DEBUG=True
. Он должен обслуживать файлы Static с такими настройками
если вы используете django.contrib.staticfile, используйте каталог staticfiles вместо static root в debug.
будет работать.
STATIC_URL = 'static/'
# STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
urlpatterns = [
path('graphql', include('api.urls')),
path('mdeditor/', include('mdeditor.urls')),
path('admin/', admin.site.urls),
path('', RedirectView.as_view(url=reverse_lazy('admin:index'))),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL,
document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Измените код обслуживания статических файлов в файле settings.py на этот.
STATIC_URL = "/staticfiles/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
Я создал папку staticfiles и поместил туда файл favicon.ico.
Теперь он работает с такими настройками:
настройки (добавьте STATICFILES_DIRS для статических файлов):
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'staticfiles')]
урлы (удалите статические для STATIC_URL):
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Переопределите admin/base.html (ничего не изменилось):
{% block extrahead %}
<link rel="shortcut icon" href="{% static 'favicon.ico' %}" />
{% endblock %}
И имея работающую команду collectstatic.