Почему 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())

Джонни ответ отлично, но все равно не сработало для меня, просто добавив те строки, описанные там. Основываясь на этом ответе, шаги, которые действительно работали для меня, где:

  1. установить WhiteNoise как описано:

    pip install WhiteNoise
    
  2. создать 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
    
  3. затем измените ваш wsgi.py файл, как объясняется в ответе Джонни:

    #wsgi.py
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
    
  4. после этого разверните изменения на своем сервере (с помощью git или что бы вы ни использовали).

  5. наконец, запустить 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 для выполнения статических файлов.

Примечание: информация должна использоваться только для тестирования