Я сбит с толку 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
, однако, я указал на другой каталог.Было бы здорово, если бы кто-нибудь мог объяснить рабочий процесс каждой настройки: как файлы собираются и управляются, и что было бы хорошей практикой для подражания.
Спасибо.
django
django-urls
django-staticfiles
user993563
источник
источник
if settings.DEBUG:
django не очень хорош для обслуживания статических носителей, это следует оставить реальному веб-серверу.Ответы:
STATIC_ROOT
теперь команда
./manage.py collectstatic
скопирует все статические файлы (т.е. статические файлы в ваших приложениях, статические файлы по всем путям) в каталог/var/www/example.com/static/
. теперь вам нужно только обслуживать этот каталог на apache или nginx..etc.STATIC_URL
Если установить
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 вы можете ссылаться на него:
который будет отображать:
источник
{{ STATIC_URL }}jquery.js
и{% static "jquery.js" %}
одинаковы. т.е. оба вернутся/static/jquery.js
. Новая Джанго версия рекомендуется использовать{% static "jquery.js" %}
, но вам необходимо загрузить templatetag, то есть{% load staticfiles %}
. в более старой версии django рекомендует{{STATIC_URL}}
static
метод вместоSTATIC_URL
метода, и ошибка исчезла. Хороший звонок по предложениям, основанным на версиях.STATICFILES_DIRS
: Здесь вы можете хранить статические файлы для вашего проекта, например, те, которые используются в ваших шаблонах.STATIC_ROOT
: оставьте этоmanage.py collectstatic
поле пустым, когда вы это сделаете , он будет искать все статические файлы в вашей системе и перемещать их сюда. Ваш статический файловый сервер должен быть сопоставлен с этой папкой, где бы он ни находился. Проверьте его после запуска collectstatic, и вы обнаружите, что структура каталогов построена django.--------Редактировать----------------
Как указывает @DarkCygnus, STATIC_ROOT должен указывать на каталог в вашей файловой системе, папка должна быть пустой, поскольку она будет заполнена Django.
или
-------- Конец редактирования -----------------
STATIC_URL
: '/ static /' обычно нормально, это просто префикс для статических файлов.источник
STATICFILES_DIRS
должны служить дополнительными каталогами для статических файлов. Если вы поместите все свои css / js / images в папку APP_NAME / static / APP_NAME, то указывать не нужноSTATICFILES_DIRS
.settings.py
(путем выполненияSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
) перед запуском команды collectstatic.Все приведенные выше ответы полезны, но никто не решил мою проблему. В моем производственном файле был мой 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 /'
источник