Django 2.2 не обслуживает статические файлы - PullRequest
0 голосов
/ 09 июня 2019

В настоящее время я работаю над некоторыми уроками, чтобы расширить мои знания о Django.При этом я решил использовать самую последнюю версию Django.Мне удалось преодолеть большинство расхождений между моим кодом и кодом учебника, за исключением одного - статические файлы не обслуживаются.Теперь я не совсем уверен, что разница строго из-за версии Django.Вот что происходит.

У меня есть следующая структура проекта:

enter image description here

settings.py

STATIC_URL = '/static/'

STATIC_FILES = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Что интересно, так это то, что с этой конфигурацией проект может успешно найти шаблоны.Однако, как упоминалось выше, он не может найти статические файлы.Почему это так?

Кроме того, этот учебник настраивает необычную конфигурацию в том, что каталоги static и templates расположены внутри каталога основного приложения, тогда как у меня обычно они на один уровень выше, то есть вкорневой каталог проекта.Может ли это быть частью проблемы?Что в настройках этого конкретного проекта заставляет Django искать файлы на один каталог ниже?Настройки кажутся такими же, как и в других проектах, которые я делал.Однако эти проекты содержали каталоги static и templates в корневом каталоге проекта.

Любая помощь и разъяснения приветствуются.

Редактировать:

urls.py

from django.contrib import admin
from django.urls import path
from .views import home

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home')
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Ответы [ 5 ]

1 голос
/ 09 июня 2019

попробуйте это:

STATIC_ROOT = os.path.join (BASE_DIR, "taskbuster", "static")
1 голос
/ 09 июня 2019

Для обслуживания статических файлов необходимо добавить следующую конфигурацию в urls.py как:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Далее, я считаю хорошей практикой помещать static и templates в свои собственные приложения, это полезно, если вы хотите сделать это приложение подключаемым в ближайшем будущем.

Или рекомендуется также собрать все статические файлы в каталог уровня проекта и добавить в настройки следующее для его идентификации.

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

edit: я просто вижу обновленный вопрос. Попробуйте добавить это:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home')
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Это говорит о том, что пока мы находимся в режиме отладки, обслуживаем статические файлы.

1 голос
/ 09 июня 2019

STATIC_FILES ничего не значит для Джанго, насколько я знаю, хотя, возможно, вы используете это для другой цели.

То, как вы определили STATIC_ROOT, указывало на несуществующий каталог.

В StackOverflow есть хорошая ссылка здесь

1 голос
/ 09 июня 2019

попробуйте заменить это:

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")

на

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")

Также укажите состояние файлов (например, 404 сообщения)

0 голосов
/ 09 июня 2019

Мне удалось решить проблему, изменив настройки на следующее:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")

Кроме того, было полезно прочитать следующую документацию, когда пытались понять, как ее исправить

https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-STATICFILES_FINDERS

В частности, это четко объяснило, что сделал Django:

По умолчанию будут найдены файлы, сохраненные в настройке STATICFILES_DIRS (с использованием django.contrib.staticfiles.finders.FileSystemFinder)и в статическом подкаталоге каждого приложения (используя django.contrib.staticfiles.finders.AppDirectoriesFinder).Если присутствует несколько файлов с одинаковым именем, будет использован первый найденный файл.

...