Разница между статическим STATIC_URL и STATIC_ROOT в Django
Меня смущает static root
и хочу прояснить ситуацию.
Чтобы обслуживать статические файлы в Django, в settings.py
и urls.py
должно быть указано следующее:
import os
PROJECT_DIR=os.path.dirname(__file__)
1. Абсолютный путь к каталогу, в котором должны собираться статические файлы.
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
2. Префикс URL для статических файлов
STATIC_URL = '/static/'
3. Дополнительные места для статических файлов
STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
... и в urls.py
следующие строки:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
r'^static/(?P<path>.*)$',
'django.views.static.serve',
{'document_root': settings.STATIC_ROOT}
))
4. Мы также используем python manage.py collectstatic
Вопросы:
-
Может ли кто-нибудь объяснить мне рабочий процесс: как все должно быть в идеале. На данный момент я копирую/вставляю приведенные фрагменты кода в назначенные им места и продолжаю создавать новые файлы в статическом каталоге, и он работает. Однако в моем settings.STATIC_ROOT
я указал на другой каталог.
-
Было бы здорово, если бы кто-то мог объяснить рабочий процесс каждого параметра: как файлы собираются и управляются, и что будет хорошей практикой.
Спасибо.
Ответы
Ответ 1
STATIC_ROOT
Абсолютный путь к каталогу, где ./manage.py collectstatic
будет собирать статические файлы для развертывания. Пример: STATIC_ROOT="/var/www/example.com/static/"
Теперь команда ./manage.py collectstatic
скопирует все статические файлы (т.е. в статическую папку в ваших приложениях, статические файлы по всем путям) в каталог /var/www/example.com/static/
. теперь вам нужно только обслуживать этот каталог на apache или nginx..etc.
STATIC_URL
URL
который обслуживает статические файлы в STATIC_ROOT
(Apache или nginx..etc). Пример: /static/
или http://static.example.com/
Если вы установили STATIC_URL = 'http://static.example.com/'
, то вы должны обслуживать папку STATIC_ROOT
(то есть "/var/www/example.com/static/"
) через apache или nginx по URL 'http://static.example.com/'
(чтобы вы могли ссылаться на статический файл '/var/www/example.com/static/jquery.js'
с помощью 'http://static.example.com/jquery.js'
)
Теперь в ваших django-шаблонах вы можете ссылаться на это:
{% load static %}
<script src="{% static "jquery.js" %}"></script>
который сделает:
<script src="http://static.example.com/jquery.js"></script>
Ответ 2
STATICFILES_DIRS
: Здесь вы можете хранить статические файлы для вашего проекта, например, те, которые используются вашими шаблонами.
STATIC_ROOT
: оставьте это пустым, когда вы manage.py collectstatic
, он будет искать все статические файлы в вашей системе и перемещать их сюда. Ваш статический файловый сервер должен быть привязан к этой папке, где бы он ни находился. Проверьте это после запуска collectstatic, и вы увидите структуру каталогов, созданную django.
--------Редактировать----------------
Как указывает @DarkCygnus, STATIC_ROOT должен указывать на каталог в вашей файловой системе, папка должна быть пустой, так как она будет заполнена Django.
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles'))
или же
STATIC_ROOT = '/opt/web/project/static_files
'
--------End Редактировать -----------------
STATIC_URL
: '/static/' обычно в порядке, это просто префикс для статических файлов.
Ответ 3
Все ответы выше полезны, но никто не решил мою проблему. В моем рабочем файле мой STATIC_URL был https://<URL>/static
и я использовал тот же STATIC_URL в моем файле dev settings.py.
Это приводит к тихой ошибке в django/conf/urls/static.py.
Тест elif not settings.DEBUG or '://' in prefix:
выбирает "//" в URL и не добавляет статический шаблон URL, в результате чего статические файлы не обнаруживаются.
Было бы полезно, если бы Django выложил сообщение об ошибке, в котором говорилось, что вы не можете использовать http(s)://
with DEBUG = True
Мне пришлось изменить STATIC_URL на "/static/"