Разница между статическим STATIC_URL и STATIC_ROOT в Django - PullRequest
106 голосов
/ 31 декабря 2011

Я смущен 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. Было бы замечательно, если бы кто-то мог объяснить рабочий процесс каждого параметра: как файлы собираются и управляются, и что будет хорошей практикой для подражания.

Спасибо.

Ответы [ 3 ]

70 голосов
/ 05 сентября 2013

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>
27 голосов
/ 31 декабря 2011

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

STATIC_ROOT: оставьте это пустым, когда вы выполните manage.py collectstatic, он будет искать все статические файлы в вашей системе и перемещать их сюда. Ваш статический файловый сервер должен быть привязан к этой папке, где бы он ни находился. Проверьте его после запуска collectstatic, и вы увидите структуру каталогов, созданную django.

-------- Edit ----------------

Как указал @DarkCygnus, STATIC_ROOT должен указывать на каталог в вашей файловой системе, папка должна быть пустой, так как она будет заполнена Django.

STATIC_ROOT = os.path.join (BASE_DIR, 'staticfiles'))

или

STATIC_ROOT = '/ opt / web / project / static_files

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

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

0 голосов
/ 13 января 2019

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

...