Почему настройка 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 настройки?

987   11  

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())

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

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

поддержка аргументов строкового представления для 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 для выполнения статических файлов.

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

Comments

    Ничего не найдено.