我建立一个应用程序使用Django作为我的主力。到目前为止,一切都很好-指定的数据库设置,配置的静态目录,url,视图等。但是当我想要渲染自己漂亮的自定义404.html和500.html页面时,麻烦就来了。
我阅读了关于自定义错误处理的文档,并在UrlsConf中设置了必要的配置,创建了相应的视图,并将404.html和500.html添加到我的应用程序的模板目录(在settings.py中也指定了)。
但是文档说,在Debug关闭之前,您实际上可以查看自定义错误视图,所以我确实关闭了它来测试我的东西,而那就是事情变得疯狂的时候!
我不仅无法查看自定义404.html(实际上,它加载,但因为我的错误页面每个包含一个图形错误消息-作为一些漂亮的图像),错误页面的源加载,但没有其他加载!甚至没有链接CSS或Javascript!
一般来说,一旦我设置DEBUG = False,所有的视图将加载,但任何链接的内容(CSS, Javascript,图像等)不会加载!发生什么事情了?是否有什么东西我丢失了,关于静态文件和调试设置?
对于Django的最新版本,请查看这里的答案:https://stackoverflow.com/a/7639983/6180987
对于django 1.10以下的版本,解决方案应该工作:
只要打开你的项目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 }), ]
如果你在开发中使用静态服务视图,你必须有DEBUG = True:
警告
这只在DEBUG为True时有效。
这是因为这种观点过于粗暴
效率低下,而且可能不安全。
这只适用于本地
开发,绝不应该使用
在生产中。
文档:在开发中提供静态文件
更新链接,还有这个
编辑:你可以添加一些url只是为了测试你的404和500模板,只是在你的url中使用通用视图direct_to_template。
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
('^404testing/$', direct_to_template, {'template': '404.html'})
)
这是正常且有意为之的行为。
Warning
This will only work if DEBUG is True.
you can actually view custom error views until Debug is Off
如果Django只是从文件系统中读取并发送一个文件,那么它与普通的web服务器相比没有任何优势,所有的web服务器都能够自己提供文件。
此外,如果你用Django提供静态文件,你会让Python进程在请求期间一直很忙,它将无法提供更适合它的动态请求。
由于这些原因,Django静态视图仅设计用于开发期间,如果DEBUG设置为False,则它将无法工作。
因为在开发过程中,我们通常一次只有一个人访问站点
developer), Django可以很好地提供静态文件。