Как настроить "Django" на создание нескольких директорий развертывания 'STATIC_ROOT' в файле settings.py?

Вот в чем проблема, при миграции нескольких 'STATICFILES_DIRS', у меня все работает, и сервер продолжает работать без ошибок...

... Вот сниппет к моему 'STATICFILES_DIRS' ...

...
STATIC_URL = 'Application/'

#Multiple Static Directories
STATICFILES_DIRS = [
    os.path.join('Application', 'Bootstrap'),
    os.path.join('Application', 'html'),
]
#End of Multiple Static Directories
STATIC_ROOT = 'Application/templates/Application'
...

... Что касается фактической проблемы, с которой я столкнулся во время выполнения команды "python3 manage.py runserver", то фрагмент error выглядит следующим образом...

...
STATIC_URL = 'Application/'

#Multiple Static Directories
STATICFILES_DIRS = [
    os.path.join('Application', 'Bootstrap'),
    os.path.join('Application', 'html'),
]
#End of Multiple Static Directories

#Multiple Static Root Directories
STATIC_ROOT = [
    os.path.join('Application', 'templates/Application'),
    os.path.join('Domains', 'https://example.com'),
]
#End of Multiple Static Root Directories
...

... Есть ли способы решить эту ошибку для того, чтобы Django читал/генерировал несколько 'STATIC_ROOT' директорий развертывания?

Привет, ~ Рикки Кеннибрю

TL;DR

Чтобы ответить на ваш вопрос напрямую: нет, официального способа использовать несколько STATIC_ROOT в Django.

Возможно, могут быть очень хакерские решения (не рекомендуется), но в целом так Django не работает со статическими файлами.

Вы не указали обратную связь для ошибки, на которую ссылаетесь, но я подозреваю, что это что-то вроде:

TypeError: expected str, bytes or os.PathLike object, not list

Django ожидает, что STATIC_ROOT будет одним путем, а не списком путей (как в вашем примере). Директория STATIC_ROOT даже не используется во время разработки (когда вы выполняете команду runserver), но Django проверяет файл настроек и обнаруживает, что параметр STATIC_ROOT не настроен должным образом.

Более подробное объяснение ниже.

Базовые понятия

Существует три основных понятия (а также настройки), связанных со статическими файлами (ну, их больше, но для данного вопроса важны именно эти). Я кратко изложу их ниже, но за полным описанием обращайтесь к документации по ссылке.

STATIC_URL

STATIC_URL - это одиночный URL, по которому обслуживаются ваши статические файлы. Это может быть URL-путь или полный URL (например, если вы используете поддомен для обслуживания статических файлов).

Если ваш сайт example.com, а STATIC_URL - Application/ (как в вашем примере), ваши статические файлы будут обслуживаться по адресу https://example.com/Application/.

Точный путь URL для данного файла зависит от его расположения по отношению к каталогу STATIC_ROOT. Так, если файл main.css находится непосредственно в каталоге STATIC_ROOT, он будет доступен по адресу https://example.com/Application/main.css. С другой стороны, если файл находится в подкаталоге внутри STATIC_ROOT, например css/main.css, то он будет доступен по адресу https://example.com/Application/css/main.css.

Настройка STATIC_URL тесно связана с тегом шаблона static. При ссылке на статические файлы в шаблонах не следует использовать жестко закодированные URL напрямую. Вместо этого следует использовать тег шаблона static, например {% static 'css/main.css' %}. Тогда Django использует ваш STATIC_URL для генерации соответствующего URL. Если в какой-то момент вы решите изменить ваш STATIC_URL, например, с Application/ на static/, все эти URL будут обновлены автоматически.

Как видите, вы не можете иметь несколько STATIC_URLs, потому что Django не будет знать, какой из них использовать в шаблонах (при условии, что вы используете тег шаблона static, как и должно быть). А поскольку пути в этих URL представляют реальные файлы, расположенные в каталоге STATIC_ROOT, вы не можете иметь несколько STATIC_ROOTs.

STATICFILES_DIRS

STATICFILES_DIRS - необязательные пути для поиска статических файлов. Здесь можно указать несколько значений.

По умолчанию Django ищет статические файлы в директории static в каждом приложении, которое у вас в настройках INSTALLED_APPS. Например, если вы создали приложение Django с именем myapp, Django автоматически найдет статические файлы в каталоге myapp/static.

Иногда этого недостаточно. Допустим, у вас есть статические файлы, которые не связаны с каким-либо конкретным приложением. В таких случаях вы можете захотеть поместить эти файлы в глобальный статический каталог, который может находиться, например, в корневом каталоге вашего проекта. Вы можете использовать настройку STATICFILES_DIRS, чтобы сообщить об этом Django в вашем settings.py файле:

# This should already be in your settings (in modern Django versions)
BASE_DIR = Path(__file__).resolve().parent.parent

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

Обратите внимание, что я указываю путь относительно настройки BASE_DIR. Обычно это рекомендуемый способ построения путей внутри проекта. Если вы используете шаблон проекта по умолчанию, то BASE_DIR должен указывать на корень проекта (каталог, в котором находится файл manage.py).

STATIC_ROOT

Наконец, мы переходим к настройке STATIC_ROOT. Это единственный путь к директории, куда копируются все статические файлы при запуске проекта в производство.

STATIC_ROOT = BASE_DIR / "public/static"

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

Важная фраза здесь - "в производстве". Когда вы запускаете проект локально с помощью команды runserver, STATIC_ROOT не используется . Django будет обслуживать ваши статические файлы непосредственно из любого места, которое он сможет найти. Это включает в себя каталоги, указанные в STATICFILES_DIRS, и все static каталоги внутри ваших приложений.

Еще один важный момент: не следует вручную добавлять какие-либо файлы в STATIC_ROOT. Это четко указано в документации для настройки STATIC_ROOT:

Это должен быть изначально пустой каталог назначения для сбора ваших статических файлов из их постоянных мест в один каталог для удобства развертывания; это не место для постоянного хранения ваших статических файлов. Вы должны сделать это в каталогах, которые будут найдены поисковиками staticfiles, а по умолчанию это подкаталоги 'static/' и любые каталоги, которые вы включите в STATICFILES_DIRS).

Позже, когда вы развернете свой проект на производстве , вы уже не сможете использовать runserver и должны будете позаботиться о обслуживании статических файлов самостоятельно (например, используя готовый к производству сервер, такой как Nginx). Тогда вы обычно хотите, чтобы все статические файлы находились в одном месте (STATIC_ROOT), чтобы их можно было легко обслуживать. Для этого используется команда collectstatic, которая копирует все статические файлы в папку STATIC_ROOT.

Вся идея каталога STATIC_ROOT заключается в том, что он собирает все статические файлы из разных мест (например, из нескольких STATICFILES_DIRS), поэтому нет смысла иметь несколько STATIC_ROOT каталогов.

Recap

Итак, подведем итоги:

  • Вам вообще не нужно указывать STATICFILES_DIRS, если вы размещаете статические файлы в static директориях внутри ваших приложений.
  • Вы можете указать несколько STATICFILES_DIRS, если вы хотите использовать другие места для ваших статических файлов.
  • Вы можете указать только одно STATIC_URL и одно STATIC_ROOT.
  • STATIC_ROOT используется только в производстве для обслуживания всех ваших статических файлов из одного места.
  • Вы не добавляете статические файлы вручную в STATIC_ROOT (вы используете команду collectstatic для копирования всех статических файлов в STATIC_ROOT).

Я не знаю, что именно вы используете, но если вам нужно какое-то разделение, я рекомендую просто использовать подкаталоги в одном STATIC_ROOT:

  • <STATIC_ROOT>/some_dir1
  • <STATIC_ROOT>/some_dir2

Если вы создадите каталог some_dir1 внутри любого из STATICFILES_DIRS, то он будет скопирован в STATIC_ROOT при запуске collectstatic.

Вернуться на верх