在 Django 中退出调试时不会加载静态文件

Posted

技术标签:

【中文标题】在 Django 中退出调试时不会加载静态文件【英文标题】:Static files won't load when out of debug in Django 【发布时间】:2011-09-18 07:26:30 【问题描述】:

我正在创建一个 Django 项目。我刚刚尝试将项目从调试中移除,DEBUG = False,由于某种原因,我的所有静态文件都没有显示出来。他们给出的错误代码为 500。我该如何解决这个问题?

一些settings.py:

DEBUG = True
TEMPLATE_DEBUG = DEBUG
...
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

【问题讨论】:

你能说得更具体点吗,哪一部分?很长。 您是通过 django 开发服务器还是您自己的网络服务器提供静态文件。如果它是开发服务器,那么您在 URL 中的哪个位置处理静态文件?您可能会发现,一旦关闭 DEBUG,处理提供静态文件的 URL 就会被禁用 我不确定我在哪里处理静态文件,我使用的是 Django 开发服务器。我认为发生的事情就是你写的,在关闭 DEBUG 时,URL 对静态文件的处理被禁用,知道我应该做什么吗? 这是重复问题的答案:***.com/a/5836728/1224827 Why does DEBUG=False setting make my django Static Files Access fail?的可能重复 【参考方案1】:

静态文件应用不会在 DEBUG=False 模式下自动提供静态媒体。来自django.contrib.staticfiles.urls

# Only append if urlpatterns are empty
if settings.DEBUG and not urlpatterns:
    urlpatterns += staticfiles_urlpatterns()

您可以通过手动附加到您的urlpatterns 来提供它,或者使用服务器来提供静态文件(就像在非调试模式下运行 Django 项目时那样)。

虽然我想知道的一件事是为什么您会收到 500 状态代码响应而不是 404。在这种情况下有什么异常?

编辑

因此,如果您仍想通过 staticfiles 应用程序提供静态文件,请将以下内容添加到您的根 url conf (urls.py):

if settings.DEBUG is False:   #if DEBUG is True it will be served automatically
    urlpatterns += patterns('',
            url(r'^static/(?P<path>.*)$', 'django.views.static.serve', 'document_root': settings.STATIC_ROOT),
    )

一些事情你需要记住:

不要在生产环境中使用它(它的速度较慢,因为静态文件呈现通过 Django 而不是由您的 Web 服务器直接提供服务) 很可能您必须使用管理命令将静态文件收集到您的STATIC_ROOT (manage.py collectstatic) 中。请参阅staticfiles app docs 了解更多信息。这是必要的,因为您在非调试模式下运行。 别忘了from django.conf import settings 在你的urls.py :)

【讨论】:

我不确定我是否理解,这是一个答案还是一个问题,你说的部分在哪里:这是你应该做的......? “您可以通过手动附加到您的 urlpatterns 或使用服务器来提供静态文件来提供它(就像在非调试模式下运行 Django 项目时应该这样做的那样)。”答案是什么?如果需要,我会为您添加一个示例,尽管它与在 Django 1.3 之前提供静态文件相同。是的,最后一个是问题。那么这个 500 响应会抛出什么异常呢?只是感兴趣。 太好了,成功了,我刚刚将那段代码添加到我的 urls.py 文件中,它就像一个魅力......谢谢。 我对 500 的猜测是——因为 DEBUG 为 True——django 然后尝试渲染一个 404.html 模板,这会引发 TemplateDoesNotExist 错误,因此它会尝试渲染一个 500.html 模板,这也不存在,只是提高了 500。你认为 django 会更好地处理这种情况,但事实并非如此。 @PankajAnand 它仍然建议直接通过 apache 提供静态文件,而不是通过 Django。至少一旦您的实例运行生产流量,它就会有利于性能。【参考方案2】:

在 Django 1.3 中,如果您只是使用 manage.py 运行服务器进行测试,您可以添加选项“--insecure”,如staticfiles docs 中所述:

它似乎仍然向管理员发送电子邮件说没有模板,但它确实提供静态文件。

我不确定电子邮件问题是故意还是错误

【讨论】:

我可以确认这仍然适用于 Django 1.5。谢谢:) 谢谢。这就是我最终所需要的。

以上是关于在 Django 中退出调试时不会加载静态文件的主要内容,如果未能解决你的问题,请参考以下文章

Django本地调试时模拟服务器使用url方式访问静态文件(不建议使用)

Django 在使用开发服务器时不会提供静态文件

Django设置 DEBUG=False后静态文件无法加载解决

调试模式打开时的 Django 和静态文件

如何调试使用 whitenoise、gunicorn 和 heroku 服务的 django 静态文件?

django 中静态文件项目加载问题