Почему DEBUG=False делает мой доступ к статическим файлам django неудачным?
Я создаю приложение, используя Django в качестве моей рабочей лошади. До сих пор все было хорошо - заданные настройки БД, настроенные статические каталоги, URL-адреса, представления и т. д. Но неприятности начали прокрадываться в тот момент, когда я хотел сделать свой собственный красивый и пользовательский 404.html и 500.HTML-страница.
Я прочитал документы по пользовательской обработке ошибок и установил необходимые конфигурации в UrlsConf, создал соответствующие представления и добавил 404.html и 500.html в каталог шаблонов моего приложения (указан в в settings.py тоже).
но доктора говорят you can actually view custom error views until Debug is Off
, поэтому я выключил его, чтобы проверить свои вещи, и вот тогда все приходит в бешенство!
Я не только не могу просмотреть пользовательский 404.html (на самом деле он загружается, но поскольку мои страницы ошибок содержат графическое сообщение об ошибке-как какое-то приятное изображение), источник страницы ошибок загружается, но больше ничего не загружается! Даже не связанный CSS или Javascript!
вообще, как только я поставил DEBUG = False
, все виды загрузки, но связанных содержимое (CSS, Javascript, изображения и т. д.) Не загружается! Что происходит? Есть ли что-то отсутствующее, касающееся статических файлов и DEBUG
настройки?
11 ответов
с отключенной отладкой Django больше не будет обрабатывать статические файлы для вас - ваш производственный веб-сервер (Apache или что-то еще) должен позаботиться об этом.
Если вам все еще нужен статический сервер локально (например, для тестирования без отладки), вы можете запустить devserver в небезопасном режиме:
manage.py runserver --insecure
можно использовать WhiteNoise для обслуживания статических файлов в производство.
установка:
pip install WhiteNoise
и изменить свой wsgi.py
Если вы используете статическое представление обслуживания в разработке, вы должны иметь DEBUG = True:
предупреждение
Это будет работать, только если DEBUG имеет значение True.
это потому, что это мнение грубо неэффективно и, вероятно, небезопасно. Это предназначено только для местных развитие, и никогда не должно быть использовано в производстве.
Docs: обслуживание статических файлов в developent
EDIT: вы могли бы добавьте несколько URL-адресов, чтобы проверить шаблоны 404 и 500, просто используйте общий вид direct_to_template в своих URL-адресах.
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
('^404testing/$', direct_to_template, {'template': '404.html'})
)
вы действительно можете обслуживать статические файлы в производственном приложении Django, безопасно и без DEBUG=True
.
вместо использования самого Django используйте dj_static в вашем файле WSGI (github):
# requirements.txt:
...
dj-static==0.0.6
# YOURAPP/settings.py:
...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'
# YOURAPP/wsgi.py:
...
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
Джонни ответ отлично, но все равно не сработало для меня, просто добавив те строки, описанные там. Основываясь на этом ответе, шаги, которые действительно работали для меня, где:
-
установить WhiteNoise как описано:
pip install WhiteNoise
-
создать
STATIC_ROOT
переменная и добавьте WhiteNoise к вашемуMIDDLEWARE
переменнаяsettings.py
:#settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise 'django.contrib.sessions.middleware.SessionMiddleware', ... ] #... STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
-
затем измените ваш
wsgi.py
файл, как объясняется в ответе Джонни:#wsgi.py from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application)
после этого разверните изменения на своем сервере (с помощью git или что бы вы ни использовали).
-
наконец, запустить
collectstatic
из своегоmanage.py
на ваш сервер. Это скопирует все файлы из ваших статических папок вSTATIC_ROOT
каталог, который мы указали ранее:$ python manage.py collectstatic
теперь вы увидите новую папку с именем
staticfiles
, который содержит такие элементы.
после выполнения этих шагов теперь вы можете запустить свой сервер и сможете видеть свои статические файлы в рабочем режиме.
обновление: в случае, если у вас версия изменений указывает, что больше нет необходимости объявлять WSGI_APPLICATION = 'projectName.wsgi.application'
на .
просто откройте свой проект urls.py, затем найдите это утверждение if.
if settings.DEBUG:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
вы можете изменить настройки.Отладка на True и он будет работать всегда. Но если ваш проект является чем-то серьезным, вам следует подумать о других решениях, упомянутых выше.
if True:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
в django 1.10 вы можете написать так:
urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]
Вы можете отлаживать это по-разному. Вот мой подход.
localsettings.py:
DEBUG = False
DEBUG404 = True
urls.py:
from django.conf import settings
import os
if settings.DEBUG404:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
)
обязательно прочитайте документацию ;)
https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true
In urls.py я добавил эту строку:
from django.views.static import serve
добавьте эти два URL в urlpatterns:
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
и статические и медиафайлы были доступны, когда DEBUG=FALSE.
Надеюсь, это поможет:)
поддержка аргументов string view для url () устарела и будет удалена в Django 1.10
мое решение - это просто небольшая коррекция решения Conrado выше.
from django.conf import settings
import os
from django.views.static import serve as staticserve
if settings.DEBUG404:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', staticserve,
{'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
)
хотя это не безопасно, но вы можете изменить исходный код. выберите Python/2.7/site-packages/django/conf/urls/static.py
затем отредактируйте, как показано ниже:
if settings.DEBUG or (prefix and '://' in prefix):
тогда, если settings.debug==False
это не повлияет на код, также после запуска try python manage.py runserver --runserver
для выполнения статических файлов.
Примечание: информация должна использоваться только для тестирования