我正在使用Django作为我的主力构建应用程序。 到目前为止,一切都很好-指定了数据库设置,配置的静态目录,URL,视图等。但是,当我想呈现自己漂亮的自定义404.html和500.html页面时,麻烦开始悄悄出现。
我阅读了有关自定义错误处理的文档,并在UrlsConf中设置了必要的配置,创建了相应的视图,并将404.html和500.html添加到了我的应用程序的模板目录中(也在settings.py中指定)。
但是文档说you can actually view custom error views until Debug is Off
, you can actually view custom error views until Debug is Off
,所以我确实将其关闭以测试我的东西,这就是东西发疯的时候!
我不仅无法查看自定义的404.html(实际上,它已加载,而且由于我的错误页面每个都包含图形错误消息(如一些漂亮的图像)),因此错误页面的源也已加载,但没有其他内容加载! 甚至没有链接的CSS或Javascript!
通常,一旦我设置DEBUG = False
,所有视图都会加载,但是任何链接的内容(CSS,Javascript,图像等)都不会加载! 发生了什么? 关于静态文件和DEBUG
设置是否缺少某些内容?
#1楼
实际上,您可以安全地在生产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())
#2楼
不再支持对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')} ),
)
#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)
而且你很好走!
但是,实际上不建议在生产过程中以这种方式提供静态文件。 您的生产Web服务器(如nginx)应该注意这一点。
#4楼
只需打开您的项目urls.py,然后找到此if语句即可。
if settings.DEBUG:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
您可以更改设置。在True上启用DEBUG,它将始终运行。 但是,如果您的项目很严肃,那么您应该考虑上面提到的其他解决方案。
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 }), ]
#5楼
尽管它不是最安全的,但是您可以在源代码中进行更改。 导航到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
来运行静态文件。
注意 :信息仅应用于测试
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3207689