Что делает Django static (settings.STATIC_URL, document_root = settings.STATIC_ROOT) на самом деле? - PullRequest
2 голосов
/ 29 мая 2019

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

Если вы используете django.contrib.staticfiles, как описано выше, запустите сервер будет делать это автоматически, когда для параметра DEBUG установлено значение True. Если вы не иметь django.contrib.staticfiles в INSTALLED_APPS, вы все еще можете вручную обслуживать статические файлы, используя django.views.static.serve () вид.

Это не подходит для производственного использования! Для некоторого общего развертывания стратегии, см. Развертывание статических файлов.

Например, если ваш STATIC_URL определен как / static /, вы можете сделать добавив следующий фрагмент в ваш 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)

Примечание

Эта вспомогательная функция работает только в режиме отладки и только если префикс является локальным (например, / static /), а не URL (например, http://static.example.com/).

Также эта вспомогательная функция обслуживает только фактическую папку STATIC_ROOT; он не выполняет статическое обнаружение файлов, как django.contrib.staticfiles.

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

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

Мои вопросы

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

Пример * * тысяча восемьдесят-одина

Example Django Project

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

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-изображение)

HTML

1 Ответ

1 голос
/ 29 мая 2019

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

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, чтобы служить Джанго.Но 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,
            }),
        ]
    

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

...