Почему установка DEBUG = False делает мой доступ к статическим файлам django неудачным?

Я создаю приложение, использующее Django в качестве моей рабочей лошади. Все было хорошо до сих пор - заданные настройки db, настроенные статические каталоги, 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 (фактически, он загружается, но поскольку на моих страницах ошибок есть графическое сообщение об ошибке -as, какое-то приятное изображение), источник страницы ошибки загружается, но ничего больше не загружается! Даже не связаны CSS или Javascript!

Как правило, когда я устанавливаю DEBUG = False, все представления загружаются, но любой связанный контент (CSS, Javascript, изображения и т.д.) Не загружается! Что происходит? Что-то не хватает, что касается статических файлов и настроек DEBUG?

Ответ 1

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

Ответ 2

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

manage.py runserver --insecure

Ответ 3

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

И ты в порядке!

Кредит для творческого блога Handlebar.

НО, это действительно не рекомендуется использовать статические файлы таким образом в производстве. Ваш производственный веб-сервер (например, nginx) должен позаботиться об этом.

Ответ 4

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

Ответ 5

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

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

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

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

Документы: обслуживание статических файлов в разработке

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'})
)

Ответ 6

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

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

Выполнив следующие действия, вы теперь сможете запустить свой сервер и сможете видеть ваши статические файлы в рабочем режиме.

Обновление: если у вас была версия & lt; 4 changelog указывает, что больше нет необходимости объявлять WSGI_APPLICATION = 'projectName.wsgi.application' в вашем файле settings.py.

Ответ 7

Фактически вы можете обслуживать статические файлы в рабочем приложении 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())

Ответ 8

Просто откройте свой проект urls.py, затем найдите этот оператор if.

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

Вы можете изменить настройки .DEBUG на 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 }), ]

Ответ 9

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

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

Ответ 10

У меня просто была похожая проблема: не загружать статические файлы на героку с помощью DEBUG = False.


Решение

На production.py:

STATIC_ROOT = 'static'

Развернут и только что работал (я использую dj_static, как объяснил Робин Уинслоу).

Ответ 11

Поддержка аргументов строкового представления для 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')} ),
        )

Ответ 12

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

ПРИМЕЧАНИЕ. Информация должна использоваться только для тестирования

Ответ 13

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

Добавьте эту строку: из django.conf.urls URL для импорта

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