为什么DEBUG = False设置会使django静态文件访问失败?

二次信任 提交于 2020-03-21 11:16:33

3 月,跳不动了?>>>

我正在使用Django作为我的主力构建应用程序。 到目前为止,一切都很好-指定了数据库设置,配置的静态目录,URL,视图等。但是,当我想呈现自己漂亮的自定义404.html和500.html页面时,麻烦开始悄悄出现。

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

但是文档说you can actually view custom error views until Debug is Offyou 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)

而且你很好走!

归功于Handlebar Creative Blog

但是,实际上不建议在生产过程中以这种方式提供静态文件。 您的生产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来运行静态文件。

注意 :信息仅应用于测试

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!