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

Дякую.


Чи можете ви пояснити, що ви маєте на увазі під "поясненням робочого процесу"? також ваші шаблони URL-адреси повинні бути обумовлені, якщо ви розробляєте частину 3. Ви можете це зробити, додавши if settings.DEBUG:django не дуже добре для обслуговування статичних медіа, це слід залишити справжньому веб-серверу.
dm03514

Привіт @ user993563 Я не можу навіть знайти рішення в декількох форумах, що я хочу. але ваші запитання пояснюють це чітко дякую людині ... чудова робота ...
Mohideen bin Mohammed

Гарне пояснення, дякую
Аджай Кумар

Відповіді:


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')

Тепер у своїх шаблонах джанго ви можете посилатися на нього:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

який відображатиме:

<script src="http://static.example.com/jquery.js"></script>

1
Яка різниця між вашим прикладом і цим: href = "{% static" jquery.js "%}"
Користувач

8
@macdonjo і те, {{ STATIC_URL }}jquery.jsі те {% static "jquery.js" %}саме. тобто обидва повернуться /static/jquery.js. Новіші версії джанго рекомендують використовувати {% static "jquery.js" %}, але вам потрібно завантажити тег шаблонів, тобто {% load staticfiles %}. у старшій версії {{STATIC_URL}}
джанго

Я бачу. Я намагався знайти помилку, через яку більшість моїх шаблонів завантажувала мою таблицю стилів, крім однієї сторінки. Я змінив його на staticметод замість STATIC_URLметоду, і помилка зникла. Гарний заклик до пропозицій на основі версій.
Користувач

37

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

STATIC_ROOT: залиште це порожнім, коли ви це зробите manage.py collectstatic, він шукатиме всі статичні файли у вашій системі та переміщуватиме їх сюди. Ваш статичний файловий сервер повинен бути відображений у цій папці, де б він не знаходився. Перевірте це після запуску collestatic, і ви знайдете структуру директорій, створених 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 / образи в папку APP_NAME / static / APP_NAME, тоді не потрібно вказувати STATICFILES_DIRS.
laike9m

Дякую за відповідь, про те, що залишити порожнім STATIC_ROOT, я фактично повинен був вказати його settings.py(виконуючи STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) перед тим, як запустити колекційну команду.
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 на "/ статичний /"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.