Почему установка DEBUG = False приводит к сбою доступа к моим статическим файлам в django? - PullRequest
304 голосов
/ 29 апреля 2011

Я создаю приложение, используя 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?

Ответы [ 12 ]

420 голосов
/ 03 октября 2011

Если вам все еще нужно локально статически настроить сервер (например, для тестирования без отладки), вы можете запустить devserver в небезопасном режиме:

manage.py runserver --insecure
297 голосов
/ 29 апреля 2011

С отключенной отладкой Django больше не будет обрабатывать статические файлы - об этом позаботится ваш рабочий веб-сервер (Apache или что-то в этом роде).

27 голосов
/ 15 февраля 2016

Вы можете использовать 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) должен позаботиться об этом.

16 голосов
/ 29 апреля 2011

Если вы используете статическое представление подачи в разработке, вы должны иметь DEBUG = True:

Предупреждение

Это будет работать, только если для DEBUG установлено значение True.

Это потому, что это мнение крайне неэффективно и, вероятно, небезопасно.Это предназначено только для локальной разработки и никогда не должно использоваться в рабочей среде.

Документы: обслуживание статических файлов в 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'})
)
11 голосов
/ 18 апреля 2018

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

  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, которая содержит такие элементы.

После выполнения этих шагов вы теперь можете запустить свой сервер и сможете видеть ваши статические файлы в рабочем режиме.

Обновление: Если у вас была версия <4, <a href="http://whitenoise.evans.io/en/stable/changelog.html#v4-0" rel="nofollow noreferrer"> changelog указывает, что больше нет необходимости объявлять WSGI_APPLICATION = 'projectName.wsgi.application' в вашем settings.py файле.

11 голосов
/ 14 сентября 2014

Вы можете работать со статическими файлами в рабочем приложении 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())
10 голосов
/ 08 апреля 2018

В 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= ЛОЖЬ.
Надеюсь, это поможет:)

6 голосов
/ 09 мая 2016

Просто откройте свой проект 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 }), ]
5 голосов
/ 03 октября 2011

Вы можете отлаживать это разными способами.Вот мой подход.

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

0 голосов
/ 28 марта 2019

Я внес следующие изменения в свой проект / urls.py, и он заработал для меня

Добавьте эту строку: из django.conf.urls import url

и добавьте: url (r'^ media / (? P. *) $', serve, {'document_root': settings.MEDIA_ROOT,}), в urlpatterns.

...