Что на самом деле делает Django static (settings.STATIC_URL, document_root=settings.STATIC_ROOT)?

Я использую Джанго 2.2. Из Джанго Управление статическими файламидокументация:

If you use django.contrib.staticfiles as explained above, runserver will do this automatically when DEBUG is set to True. If you don’t have django.contrib.staticfiles in INSTALLED_APPS, you can still manually serve static files using the django.views.static.serve() view.

This is not suitable for production use! For some common deployment strategies, see Deploying static files.

For example, if your STATIC_URL is defined as /static/, you can do this by adding the following snippet to your urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Note

This helper function works only in debug mode and only if the given prefix is local (e.g. /static/) and not a URL (e.g. http://static.example.com/).

Also this helper function only serves the actual STATIC_ROOT folder; it doesn’t perform static files discovery like django.contrib.staticfiles.

Моя интерпретация

  1. статический — это вспомогательная функция, которая обслуживает файлы из STATIC_ROOTво время разработки (это правда?)
  2. статический работает только когда debug = True
  3. статический работает только с локальным префиксом, например STATIC_URL = '/static/'
  4. Когда для DEBUG установлено значение True, и я использую и настраиваю приложение staticfiles, как описано в документации, если я делаю python manage.py runserver для запуска локального сервера, обслуживание статических файлов будет обрабатываться автоматически (правда??)

Мои вопросы

  1. Что ИМЕННО делает добавление static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) к urls.py вашему проекту?
  2. Правда ли, что статический обслуживает статические файлы локально из каталога STATIC_ROOT? Чтобы проверить эту теорию, после запуска collectstatic я удалил каталоги static, чтобы убедиться, что статические файлы по-прежнему загружаются нормально (из STATIC_ROOT), и это НЕ ТАК! Почему?
  3. Как я могу проверять, что Django загружает статические файлы из моего местоположения STATIC_ROOT... а не статические каталоги в моем проекте и приложениях??
  4. Зачем нужно добавлять static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) к urlpatterns, если Django автоматически обслуживает статические файлы (упоминается в документации)?

Пример

Что на самом деле делает Django static (settings.STATIC_URL, document_root=settings.STATIC_ROOT)?

settings.py

DEBUG = True

...

INSTALLED_APPS = [
    'django.contrib.admin',
    ...
    'django.contrib.staticfiles',
    'puppies.apps.PuppiesConfig'
]

...

STATIC_URL = '/static/'

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

STATIC_ROOT = 'c:/lkdsjfkljsd_cdn'

Во всех своих шаблонах я использую {% load static %}.

Тогда я делаю: python manage.py collectstatic

Что на самом деле делает Django static (settings.STATIC_URL, document_root=settings.STATIC_ROOT)?

На данный момент, кажется, не имеет значения, есть ли у меня ниже в моем urls.py или нет - мои статические файлы все еще загружаются, НО я не знаю, поступают ли они из статических каталогов моего проекта или из моего STATIC_ROOT (c:/ lkdsjfkljsd_cdn):

if settings.DEBUG is True:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Наконец, если я удалю эти статические каталоги в своем проекте, все css, js и изображения не будут работать, что наводит меня на мысль, что мой проект Django загружает статические файлы из статических каталогов моего проекта, а НЕ STATIC_ROOT.

Итак, еще раз, как я могу сказать Django загружать статические файлы из моего местоположения STATIC_ROOT... а не статические каталоги в моем проекте и приложениях?? ИЛИ я неправильно понимаю, что Django не должен загружать файлы из моего местоположения STATIC_ROOT локально?

*Редактировать (добавление HTML-изображения)

Что на самом деле делает Django static (settings.STATIC_URL, document_root=settings.STATIC_ROOT)?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
15
0
5 411
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы смешиваете несколько вещей. Позвольте мне уточнить.

static:

Согласно документации, он предоставляет шаблон URL для обслуживания статического файла. Если вы зайдете на implementation, то увидите:

return [
        re_path(r'^%s(?P<path>.*)$' % re.escape(prefix.lstrip('/')), view, kwargs=kwargs),
]

Что он делает, так это удаляет косую черту слева от префикса (то есть преобразует /static/ в static/), а затем появляется представление (которое serve), кто извлекает файлы.

serve:

Эта функция выполняет обслуживание файлов. Он будет обслуживать файлы из корня документа.

runserver:

Команда runserver запускает сервер разработки django. Если у вас установлен django.contrib.staticfiles в INSTALLED_APPS, то он автоматически будет обслуживать статические файлы. Если вы не хотите показывать статику, используйте runserver --nostatic. collectstatic или STATIC_ROOT не имеют отношения к этой команде.

collectstatic:

Эта команда собирает все статические файлы из разных STATIC_DIRS и помещает их в папку, определенную STATIC_ROOT. collectstatic очень полезен при развертывании в производственной среде, когда вы используете обратный прокси-сервер, такой как NGINX или Apache и т. д. NGINX/Apache/Varnish использует эту папку (где collectstatic хранит статические файлы) как корневую и обслуживает статические данные из нее. Не рекомендуется использовать runserver в продакшене. Вы можете использовать gunicorn/uwsgi для обслуживания django. Но gunicorn/uwsgi не обслуживает статические файлы, поэтому для обслуживания статических файлов используется обратный прокси-сервер.

finally:

Чтобы ответить на ваши вопросы:

  1. Нет, вам не нужно помещать это в свой код, если только вы не добавляете django.contrib.staticfiles в свой INSTALLED_APPS.

  2. Нет

  3. Вам не нужно. STATIC_ROOT используется для разных целей

  4. Это не. Но для обслуживания файлов MEDIA вы можете добавить следующий шаблон:

    if settings.DEBUG:
        urlpatterns += [
            re_path(r'^media/(?P<path>.*)$', serve, {
                'document_root': settings.MEDIA_ROOT,
            }),
        ]
    

В производстве медиафайлы также должны обслуживаться обратным прокси-сервером.

Ну конечно; естественно. Но опять же, использование этого не рекомендуется для производственной настройки.

ruddra 29.05.2019 08:00

Вы можете проверить, правильно ли вы получаете статические файлы, например 127.0.0.1:8000/static/js/some.js?

ruddra 29.05.2019 09:32

Я имел в виду, вы получаете 404 в localhost:8000/static/puppies/js/base.js :)?

ruddra 29.05.2019 09:41

Хм, это после того, как вы удалили статические файлы из проекта и добавили urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)?

ruddra 29.05.2019 09:47

Я так думаю (или, по крайней мере, согласно документам). Но мне нужно проверить реализации django.contrib.staticfiles, чтобы быть уверенным на 100%.

ruddra 29.05.2019 09:56

Другие вопросы по теме