Я использую Джанго 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.
Моя интерпретация
STATIC_ROOT
во время разработки (это правда?)debug = True
STATIC_URL = '/static/'
DEBUG
установлено значение True, и я использую и настраиваю приложение staticfiles, как описано в документации, если я делаю python manage.py runserver
для запуска локального сервера, обслуживание статических файлов будет обрабатываться автоматически (правда??)Мои вопросы
static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
к urls.py
вашему проекту?STATIC_ROOT
? Чтобы проверить эту теорию, после запуска collectstatic
я удалил каталоги static
, чтобы убедиться, что статические файлы по-прежнему загружаются нормально (из STATIC_ROOT), и это НЕ ТАК! Почему?static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
к urlpatterns
, если Django автоматически обслуживает статические файлы (упоминается в документации)?Пример
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
На данный момент, кажется, не имеет значения, есть ли у меня ниже в моем 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-изображения)
Я думаю, вы смешиваете несколько вещей. Позвольте мне уточнить.
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:
Чтобы ответить на ваши вопросы:
Нет, вам не нужно помещать это в свой код, если только вы не добавляете django.contrib.staticfiles
в свой INSTALLED_APPS
.
Нет
Вам не нужно. STATIC_ROOT используется для разных целей
Это не. Но для обслуживания файлов MEDIA вы можете добавить следующий шаблон:
if settings.DEBUG:
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]
В производстве медиафайлы также должны обслуживаться обратным прокси-сервером.
Вы можете проверить, правильно ли вы получаете статические файлы, например 127.0.0.1:8000/static/js/some.js
?
Я имел в виду, вы получаете 404 в localhost:8000/static/puppies/js/base.js
:)?
Хм, это после того, как вы удалили статические файлы из проекта и добавили urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
?
Я так думаю (или, по крайней мере, согласно документам). Но мне нужно проверить реализации django.contrib.staticfiles, чтобы быть уверенным на 100%.
Ну конечно; естественно. Но опять же, использование этого не рекомендуется для производственной настройки.