Разница между статическим 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/"