Сайт django выдает ошибку 404 для статических файлов

Проблема со статическими файлами в Django 2.

        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        TEMPLATE_DIR = os.path.join(BASE_DIR, "templates")
        STATIC_URL = '/static/'
        STATIC_ROOT = BASE_DIR + '/static/'
        STATICFILES_DIR = [
              (BASE_DIR + "static/"),
        ]


        STATICFILES_FINDERS = [
              'django.contrib.staticfiles.finders.FileSystemFinder',
             'django.contrib.staticfiles.finders.AppDirectoriesFinder',
        ]

И моя статическая структура, как показано ниже

введите здесь описание изображения

Я получаю 404 для статики. Пробовал разные вещи, но безуспешно. кстати, collectstatic уже был выполнен. Другое дело, когда я вношу изменения в папку static, collectstatic ничего не собирает. там написано "без изменений".

я новичок в Джанго. ценю за вашу помощь.


ОБНОВЛЕНИЕ 2:

Новая структура ниже введите здесь описание изображения

а настройки такие

STATIC_URL = '/static/'

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

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

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


person CorpusCallosum    schedule 14.01.2018    source источник
comment
Вы установили django.core.context_processors.static в свой список контекстных процессоров в settings.py?   -  person Rakesh    schedule 14.01.2018
comment
нет. по умолчанию нет TEMPLATE_CONTEXT_PROCESSORS.   -  person CorpusCallosum    schedule 14.01.2018


Ответы (2)


Есть 2 проблемы:

1. — это синтаксическая ошибка, на которую Digitiain указал в своем ответе:

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

2. Вы не можете добавить путь в STATIC_ROOT к вашему STTATICFILES_DIRS. Итак, если ваш STTATICFILES_DIRS выглядит так, как показано выше, STATIC_ROOT не может быть os.path.join(BASE_DIR, "static").


Первый пункт должен быть достаточно ясен. Второй тоже смутил меня в начале. Но на самом деле это имеет большой смысл:

В STATICFILES_DIRS вы говорите django, куда идти и искать статические файлы. Это в первую очередь не для того, чтобы их обслуживать, а для того, чтобы их собирать! Дело в том, что на продуктивном сервере django не должен обслуживать статические файлы; эта задача должна быть обработана веб-сервером. Подробности см. в документации. Идея заключается в том, что вы запустите команду python manage.py collectstatic, и django выполнит все пути в STATICFILES_DIRS, собираем статические файлы и кладем их... - точно! - в папке STATIC_ROOT. Теперь становится ясно, почему папка STATIC_ROOT на самом деле не может быть частью STATICFILES_DIRS, поскольку это означало бы, что django нужно будет поместить папку в себя. Опять же, это в случае производительного сервера. Во время разработки django может обрабатывать статические файлы без помощи веб-сервера, здесь больше из документации по этому вопросу.

Надеюсь, это поможет прояснить связь между STATICFILES_DIRS и STATIC_ROOT. Итог: выберите другой путь для STATIC_ROOT, и все будет хорошо!


В качестве примера у вас может быть такая структура проекта:

base_dir/
  - static/
      - css/
      - js/
      - ...
  - static_collected/
  - ...

Тогда было бы правильно определить:

# settings.py
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "static_collected")
person jojo    schedule 14.01.2018
comment
да действительно сбивает с толку поначалу. теперь моя конфигурация STATIC_URL = '/static/' STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), static ) STATICFILES_DIRS = (os.path.join(os.path.dirname(BASE_DIR)), static ) и collectstatic работает. но я предполагаю, что у меня проблема с путем, так как он создает новую статическую папку из папки проекта, если это не нормальное поведение для django - person CorpusCallosum; 14.01.2018
comment
@CorpusCallosum обратите внимание, что если STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static" ) и STATICFILES_DIRS = (os.path.join(os.path.dirname(BASE_DIR)), "static"), то STATIC_ROOT находится внутри STATICFILES_DIRS! Если BASE_DIR находится в STATICFILES_DIRS, то любой каталог внутри BASE_DIR не может стать STATIC_ROOT. Просто выберите случайную папку вне BASE_DIR для своего STATIC_ROOT и попробуйте, если все работает лучше. - person jojo; 14.01.2018
comment
@CorpusCallosum добавил пример. Я надеюсь, что это поможет вам запустить вашу установку. Дайте мне знать, если он все еще не работает. - person jojo; 15.01.2018
comment
очень ценю ваши усилия. я добавил обновление к исходному вопросу. - person CorpusCallosum; 15.01.2018
comment
@CorpusCallosum жаль слышать, что это все еще не работает. у вас есть 'django.contrib.staticfiles', в INSTALLED_APPS? - person jojo; 15.01.2018
comment
Да, это первое, что я контролировал. Это становится настоящей занозой в заднице. Очень странно. - person CorpusCallosum; 15.01.2018
comment
Давайте продолжим обсуждение в чате. - person jojo; 15.01.2018

Это может быть отвлекающим маневром, но в Django docs синтаксис для установки пути относительно вашего BASE_DIR включает os.path.join, поэтому ваш будет выглядеть так:

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

РЕДАКТИРОВАТЬ: я также только что заметил, что вы ссылаетесь на DIR, а не на DIRS, что может вызвать горе. То же самое с шаблонами.

person Digitiain    schedule 14.01.2018
comment
когда я использую соединение, он говорит?: (staticfiles.E002) Параметр STATICFILES_DIRS не должен содержать параметр STATIC_ROOT. вот почему изменено на строку conct. - person CorpusCallosum; 14.01.2018