Почему настройка DEBUG=False делает мой доступ к статическим файлам django невозможным?
Я создаю приложение, используя Django в качестве моей рабочей лошадки. Все было хорошо до сих пор-заданные настройки БД, настроенные статические каталоги, URL-адреса, представления и т. д. Но неприятности начали прокрадываться в тот момент, когда я хотел сделать свой собственный красивый и пользовательский 404.html и 500.HTML-страница.
Я прочитал документы по пользовательской обработке ошибок и установил необходимые конфигурации в UrlsConf, создал соответствующие представления и добавил 404.HTML и 500.html в каталог шаблонов моего приложения (указан в the 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 файл к этому:
from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application)и вы хорошо идти!
кредит Руль Творческий Блог.
но, это действительно не рекомендуется служить статические файлы таким образом в производстве. Ваш производственный веб-сервер (например, nginx) должен позаботиться об этом.
Если вы используете статическое представление подачи в разработке, вы должны иметь DEBUG = True:
предупреждение
Это будет работать только в том случае, если DEBUG имеет значение True.
это потому, что это мнение грубо неэффективно и, вероятно, небезопасно. Это предназначено только для местных развитие, и никогда не должно быть использовано в производстве.
Docs: обслуживание статических файлов в developent
редактировать: вы могли бы добавьте несколько 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 = Trueurls.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.
Надеюсь, это поможет:)
поддержка аргументов строкового представления для 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это не повлияет на код, также после запуска trypython manage.py runserver --runserverдля выполнения статических файлов.Примечание: информация должна использоваться только для тестирования
Comments