Разница между статическим STATIC_URL и STATIC_ROOT в Django

127

Я сбит с толку 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

Вопросы:

  1. Может ли кто-нибудь объяснить мне рабочий процесс: как все должно быть в идеале. На данный момент я копирую / вставляю приведенные выше фрагменты кода в назначенные места и продолжаю создавать новые файлы в статическом каталоге, и это работает. В моем settings.STATIC_ROOT, однако, я указал на другой каталог.

  2. Было бы здорово, если бы кто-нибудь мог объяснить рабочий процесс каждой настройки: как файлы собираются и управляются, и что было бы хорошей практикой для подражания.

Спасибо.

user993563
источник
Не могли бы вы пояснить, что вы имеете в виду под «объяснением рабочего процесса»? Кроме того, ваши шаблоны URL-адресов должны быть обусловлены, если вы разрабатываете в части 3. Вы можете сделать это, добавив, что if settings.DEBUG:django не очень хорош для обслуживания статических носителей, это следует оставить реальному веб-серверу.
dm03514
Привет @ user993563, я даже не могу найти решение на нескольких форумах, что я хочу. но ваши вопросы ясно объясняют это, спасибо человеку ... отличная работа ...
Мохидин бин Мохаммед
Хорошее объяснение, спасибо
Аджай Кумар

Ответы:

89

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>
suhailvs
источник
1
В чем разница между вашим примером и этим: href = "{% static" jquery.js "%}"
Пользователь
8
@macdonjo оба {{ STATIC_URL }}jquery.jsи {% static "jquery.js" %}одинаковы. т.е. оба вернутся /static/jquery.js. Новая Джанго версия рекомендуется использовать {% static "jquery.js" %}, но вам необходимо загрузить templatetag, то есть {% load staticfiles %}. в более старой версии django рекомендует{{STATIC_URL}}
suhailvs
Понимаю. Я пытался найти ошибку, из-за которой большинство моих шаблонов загружали мою таблицу стилей, кроме одной страницы. Я изменил его на staticметод вместо STATIC_URLметода, и ошибка исчезла. Хороший звонок по предложениям, основанным на версиях.
Пользователь
37

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'

-------- Конец редактирования -----------------

STATIC_URL: '/ static /' обычно нормально, это просто префикс для статических файлов.

Кени
источник
2
Здесь ссылка на управление статическими файлами в 1.3 docs.djangoproject.com/en/1.3/howto/static-files
keni
2
STATICFILES_DIRSдолжны служить дополнительными каталогами для статических файлов. Если вы поместите все свои css / js / images в папку APP_NAME / static / APP_NAME, то указывать не нужно STATICFILES_DIRS.
laike9m
Спасибо за ответ, что касается оставления пустым STATIC_ROOT, мне действительно пришлось указать его settings.py(путем выполнения STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) перед запуском команды collectstatic.
DarkCygnus
Хм, я понимаю, как легко это вводить в заблуждение. Когда я оставляю его пустым, я имею в виду то, что обычно он начинается пустым, без файлов. Я обновлю ответ, чтобы устранить путаницу.
keni
2

Все приведенные выше ответы полезны, но никто не решил мою проблему. В моем производственном файле был мой 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)://сDEBUG = True

Мне пришлось изменить STATIC_URL на '/ static /'

Mikee
источник