为什么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 files和Debug 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')} ), )