Відмінності між STATICFILES_DIR, STATIC_ROOT та MEDIA_ROOT


82

Які відмінності цих трьох статичних URL-адрес?

Я не впевнений, що маю рацію, я використовую MEDIA_ROOTдля зберігання завантажених фотографій (через models.ImageField())

Однак я створив скрипт JS для мого адміністратора та в admin.py. Я визначив засоби масової інформації, як показано нижче:

....
class Media:
      js = ('/admin/custom.js', )

і моє settings.py:

 ....
 STATIC_ROOT = "/home/user/project/django1/top/listing/static"

і я додав custom.jsдо STATIC_ROOT/admin/custom.js, але це не працює. Викидання 404 не знайдено помилки.

І тоді я міняю STATIC_ROOTна STATICFILES_DIRS, і це працює !!

....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"

Отже, я не розумію, що тут відбувається. Насправді я просто не розумію, в чому різниця між STATIC_ROOTі STATICFILES_DIRS.

На даний момент я тестую Django на своїй машині через virtualenv, ще не розгорнутий, чи не причина в цьому STATIC_ROOT??


1
Дивіться також графіку, яку я зробив про те, як працюють статичні файли у виробництві: djangodeployment.com/2016/11/21/…
Антоніс

Відповіді:


120

Ви можете знайти ці налаштування в документації Django . Ось мої власні визначення та цитати з документації:

  • MEDIA_ROOT- це папка, куди FileFieldбудуть переходити файли, завантажені за допомогою .

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

  • STATIC_ROOT - це папка, де зберігатимуться статичні файли після використання manage.py collectstatic

    Абсолютний шлях до каталогу, де collectstaticбудуть збиратися статичні файли для розгортання.

    Якщо staticfilesдодаток contrib увімкнено (за замовчуванням), команда collectstaticуправління збиратиме статичні файли в цей каталог. Докладніше про використання дивіться інструкції з управління статичними файлами.

  • STATICFILES_DIRS- це список папок, в яких Django буде шукати додаткові статичні файли, крім staticпапки кожного встановленого додатка.

    Цей параметр визначає додаткові розташування, через які додаток staticfiles буде проходити, якщо FileSystemFinderувімкнено пошук, наприклад, якщо ви використовуєте команду collectstaticабо findstaticкерування або використовуєте подання статичного файлу.

У налаштуваннях ви повинні мати:

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )

... де:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

як визначено в типовому Django settings.pyзараз.


3
Це легко найчіткіша відповідь ІМО, хоча я відчуваю, що це запитання - суцільна обманка
Ян Кларк

4
@MaximeLorant Чесно кажучи, ваше пояснення краще, ніж документи Django.
Eje,

2
@MaximeLorant красиво побудована відповідь. Як згадував Дже, набагато зрозуміліше, ніж самі документи.
Ніл Хікман,

126

Розвиток

STATIC_ROOT марний під час розробки, він потрібен лише для розгортання.

Перебуваючи в розробці, STATIC_ROOTнічого не робить. Навіть не потрібно його встановлювати. Django шукає статичні файли в каталозі кожної програми ( myProject/appName/static) і обслуговує їх автоматично.

Це магія, яку робить manage.py runserverколи DEBUG=True.

Розгортання

Коли ваш проект починає діяти, все змінюється. Швидше за все, ви будете обслуговувати динамічний вміст за допомогою Django, а статичні файли будуть обслуговуватися Nginx. Чому? Оскільки Nginx неймовірно ефективний і зменшить навантаження від Django.

Тут це STATIC_ROOTстає в нагоді, оскільки Nginx нічого не знає про ваш проект django і не знає, де знайти статичні файли.

Отже, ви встановлюєте STATIC_ROOT = '/some/folder/'і говорите Nginx шукати статичні файли в /some/folder/. Потім ви запускаєте, manage.py collectstaticі Django копіює статичні файли з усіх додатків, які вам потрібно /some/folder/.

Додаткові каталоги для статичних файлів

STATICFILES_DIRSвикористовується для включення додаткових каталогів для collectstaticпошуку. Наприклад, за замовчуванням Django не розпізнає /myProject/static/. Тож ви можете включити його самостійно.

Приклад

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/django/www-data/site.com/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]

19
Найкраще пояснення для STATIC_ROOT тощо. Чітке та стисле. Це те, що повинно бути в документації django.
Homunculus Reticulli

1
@Max Malysh - це рівень відповіді, який ми повинні мати. Зрозумів! A +
adhg

1
Набагато з’ясовує. Дякую!
MadPhysicist

24

Різниця між STATICFILES_DIRSіSTATIC_ROOT

STATICFILES_DIRSМоже містити інші каталоги (не обов'язково додаток каталоги) зі статичними файлами , і ці статичні файли будуть зібрані в ваш STATIC_ROOT при запуску collectstatic. Потім ці статичні файли будуть обслуговуватися вашим веб-сервером, і вони будуть обслуговуватися з вашого STATIC_ROOT.

Якщо у вас зараз є файли у вашому STATIC_ROOT, які ви хочете обслуговувати, то вам потрібно перемістити їх в інший каталог і помістити цей інший каталог STATICFILES_DIRS. Ваш STATIC_ROOTкаталог повинен бути порожнім, і всі статичні файли повинні бути зібрані в цей каталог.

MEDIA_ROOTде мультимедійні файли, всі завантажені файли. Приклад: Зображення, Файли


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