为什么DEBUG = False设置让我的django静态文件访问失败?

我正在使用Django构build一个应用程序作为我的主力。 到目前为止,所有的都已经很好了 – 指定的数据库设置,configuration的静态目录,url,视图等。但麻烦开始偷偷摸摸的时候,我想呈现自己的美丽和自定义404.html和500.html页面。

我阅读了自定义error handling的文档,并在UrlsConf中设置了必要的configuration,创build了相应的视图,并将404.html和500.html添加到我的应用的模板目录(在settings.py中指定)。

但是,文档说, you can actually view custom error views until Debug is Off ,所以我没有closures它来testing我的东西,这是什么时候东西变狂暴!

我不仅看不到自定义的404.html(实际上,它加载,但是因为我的错误页面都包含一个graphics错误消息 – 一些不错的图像),错误页面的来源加载,但没有其他加载! 甚至没有链接的CSS或Javascript!

一般来说,一旦我设置DEBUG = False ,所有的意见将加载,但任何链接的内容(CSS,Javascript,图像等)不会加载! 发生了什么? 有什么缺less有关Static filesDebug setting

closuresdebuggingclosuresDjango将不再为您处理静态文件 – 您的生产Web服务器(Apache或其他)应该照顾。

如果你仍然需要在本地服务器静态(例如testing没有debugging),你可以在不安全的模式下运行devserver:

 manage.py runserver --insecure 

如果您在开发中使用静态服务视图,则必须具有DEBUG = True:

警告

这只会在DEBUG为真时才起作用。

那是因为这个观点非常低效,可能不安全。 这只适用于本地开发,不应该用于生产。

文档:在开发中提供静态文件

编辑:你可以添加一些url来testing你的404和500模板,只需在你的url中使用通用视图direct_to_template。

 from django.views.generic.simple import direct_to_template urlpatterns = patterns('', ('^404testing/$', direct_to_template, {'template': '404.html'}) ) 

您可以使用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创意博客 。

实际上,您可以在生产Django应用程序中安全地使用静态文件,而无需DEBUG=True

而不是使用Django本身,在你的WSGI文件( github )中使用dj_static :

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

只要打开你的项目urls.py,然后find这个if语句。

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

你可以改变settings.DEBUG为真,它会一直工作。 但是,如果你的项目是一个严重的事情,那么你应该考虑上面提到的其他解决scheme。

 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 }), ] 

你可以用许多不同的方法来debugging。 这是我的方法。

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/1.2/howto/static-files/#limiting-use-to-debug-true

虽然这不是最安全的,但是你可以在源代码中改变。 导航到Python/2.7/site-packages/django/conf/urls/static.py

然后编辑如下:

 if settings.DEBUG or (prefix and '://' in prefix): 

那么如果settings.debug==False它不会影响代码,运行后也尝试python manage.py runserver --runserver来运行静态文件。

:信息只能用于testing

对url()的string视图参数的支持已被弃用,并将在Django 1.10中被删除

我的解决scheme只是对Conrado解决scheme的小改动。

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