我建立一个应用程序使用Django作为我的主力。到目前为止,一切都很好-指定的数据库设置,配置的静态目录,url,视图等。但是当我想要渲染自己漂亮的自定义404.html和500.html页面时,麻烦就来了。

我阅读了关于自定义错误处理的文档,并在UrlsConf中设置了必要的配置,创建了相应的视图,并将404.html和500.html添加到我的应用程序的模板目录(在settings.py中也指定了)。

但是文档说,在Debug关闭之前,您实际上可以查看自定义错误视图,所以我确实关闭了它来测试我的东西,而那就是事情变得疯狂的时候!

我不仅无法查看自定义404.html(实际上,它加载,但因为我的错误页面每个包含一个图形错误消息-作为一些漂亮的图像),错误页面的源加载,但没有其他加载!甚至没有链接CSS或Javascript!

一般来说,一旦我设置DEBUG = False,所有的视图将加载,但任何链接的内容(CSS, Javascript,图像等)不会加载!发生什么事情了?是否有什么东西我丢失了,关于静态文件和调试设置?


当前回答

虽然这不是最安全的,但您可以在源代码中进行更改。进入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后运行静态文件。

注意:信息仅用于测试

其他回答

我今天得到了这个问题,这在开发时解决了它,如果你仍然需要服务器本地静态(例如测试没有调试),你可以在不安全模式下运行devserver:

Manage.py runserver——不安全

不要担心,因为在生产环境中,这个托管平台(Apache、Heroku et c)将为您处理静态文件的服务。

注意:Heroku不服务器静态文件,你会想把它放在AWS或MS Azure上

这是正常且有意为之的行为。

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可以很好地提供静态文件。

实际上,你可以在Django生产应用程序中提供静态文件,而且不需要DEBUG=True。

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

让:

...
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中,我添加了这一行:

from django.views.static import serve 

在urlpatterns中添加这两个url:

url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}), 

当DEBUG=FALSE时,静态文件和媒体文件都可以访问。

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

manage.py runserver --insecure