Объяснение того, как работают файлы * stati c:
Разработка
Давайте сначала включим это в ситуацию разработки (django обслуживает ваши файлы stati c с помощью runserver ). STATIC_ ROOT в данном случае не имеет значения.
Django может найти все ваши файлы stati c в следующих местах:
- Любая папка / static /, расположенная внутри вашей папки. приложения, например, если у вас есть приложение
blog
, то папка /blog/static/
будет проанализирована. - Любая папка, указанная в
STATICFILES_DIRS
, например, если у вас есть папка assets
в главной проект, вы бы добавили его в STATICFILES_DIRS
с os.path.join(BASE_DIR, "assets")
, где BASE_DIR
- это местоположение manage.py .
Что если оба приложения blog
а вашему каталогу ресурсов нужен "lo go .png"? Вместо того, чтобы беспокоиться о том, что изображения, js файлы, css файлы имеют уникальные имена, используйте пространство имен. Внутри приложения blog
поместите все файлы stati c в /blog/static/blog/
, чтобы при их использовании вам нужно было ссылаться на /blog/logo.png
, и вы точно знаете, что это будет правильный go .png. Внутри основного проекта поместите файлы в assets/assets
(или вместо этого назовите static/assets
), чтобы вы могли обратиться к /assets/logo.png
для основных ресурсов вашего проекта.
Теперь, если вы установите STATIC_URL = "/static/"
, это скажет django, что все URL-адреса stati c файлов имеют префикс "/ static /", то есть приведенный выше lo go можно получить с помощью "/ static /assets/logo.png "и" /static/blog/logo.png ". Это необходимо, поскольку позволяет отличать URL-адрес файла stati c от URL-адресов, которые Django направляет к представлениям.
На практике в ваших шаблонах вы будете использовать {% static 'blog/logo.png' %}
, чтобы вы не нужно жестко кодировать STATIC_URL
везде.
Теперь входит в веб-пакет. Он должен поместить свои ресурсы пакетов в любой из вышеперечисленных каталогов или в свой собственный каталог, который вы также добавляете в STATICFILES_DIRS
. Давайте предположим последнее: у нас также есть папка /webpack/webpack/
в нашем проекте, которая определена в STATICFILES_DIRS
, поэтому все ресурсы веб-пакета будут доступны через префикс url "/static/webpack/".
рабочий Файл *. 1102 * должен находиться в «assets / assets» и в других ваших скриптах, если вы обращаетесь к нему через url (чтобы получить его с помощью HTTP-запроса), вы должны обращаться к нему через «/ static / assets / worker. js "или с использованием относительного URL" ../assets/worker.js".
Производство
После развертывания вы не обслуживаете ваши stati c файлы с Django больше, но с веб-сервером, например Apache или nginx. Вы настраиваете веб-сервер для распознавания любого запроса, начиная с STATIC_URL
("/ static /"), и извлекаете соответствующий файл из STATIC_ROOT
.
Итак, первое, что нужно сделать, это скопировать все файлы stati c вашего приложения django в папку / папку, доступную для вашего веб-сервера. Это расположение вне папки вашего проекта .
Установите STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'static'))
, что указывает на каталог "stati c" в родительской папке вашего проекта.
Затем запустите python manage.py collectstatic
.
Это скопирует все файлы stati c в эту новую папку stati c вне вашего проекта. Вы увидите:
path/to/dir/
|_ static/
| |_ blog/
| | |_ logo.png
| |_ assets/
| | |_ logo.png
| | |_ worker.js
| |_ webpack/
| |_ some_file.js
|_ django_project/
|_ manage.py
|_ main_app/
| |_ settings.py
|_ assets/
| |_ assets/
| |_ worker.js
|_ blog/
| |_ static/
| |_ blog/
...
Теперь, когда ваш веб-сервер увидит URL «/static/assets/worker.js», он вернет файл в «path / to / dir / static / assets». / Worker в правильном расположении «путь / к / dir / static / webpack /», потому что именно там их будет искать ваш веб-сервер.
Представьте себе, что теперь вы перемещаете все в сторонний поставщик услуг хранения. Затем вам нужно сделать только две вещи:
- Установить и настроить серверную часть хранилища для этого провайдера хранения, чтобы Django знал, как читать / записывать файлы там (с
collecstatic
). Это может включать настройку STATIC_ROOT
, например, STATIC_ROOT = https://my-bucket.my-storage-provider.com/static
. - . Установите
STATIC_URL
в качестве URL-адреса провайдера хранения, например, STATIC_URL = https://my-bucket.some_cdn.com/
. Здесь мы указываем на CDN, который вы настроили, чтобы узнать, откуда можно извлечь файлы.
Вот и все, все продолжает работать.