Django调试模式关闭后静态文件无法加载

18

我正在创建一个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',
)

你能更具体一些吗?是哪个部分?它相当长。 - Nachshon Schwartz
1
你是通过Django开发服务器还是自己的Web服务器提供静态文件服务?如果是开发服务器,你在URL中如何处理静态文件?一旦关闭DEBUG模式,你可能会发现处理静态文件的URL被禁用了。 - Timmy O'Mahony
我不太确定在哪里处理静态文件,因为我正在使用Django开发服务器。我想发生的事情就是您所写的,关闭DEBUG后处理静态文件的URL被禁用了,您有什么建议? - Nachshon Schwartz
@Nayish,它说这个问题是在2011年4月提出的,而你的是在2011年6月。 - Blairg23
显示剩余2条评论
2个回答

38

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

# Only append if urlpatterns are empty
if settings.DEBUG and not urlpatterns:
    urlpatterns += staticfiles_urlpatterns()
你可以通过手动添加到 urlpatterns 或使用服务器来提供它,以便像在非DEBUG模式下运行Django项目时一样提供静态文件。

不过我想知道的是,在这种情况下为什么会收到500状态码响应而不是404。这种情况下异常是什么?

编辑

所以如果你仍然想通过staticfiles应用程序提供静态文件,请将以下内容添加到根url配置文件(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)。有关更多信息,请参见静态文件应用程序文档。这是必要的,因为你运行在非Debug模式下。
  • 别忘了在你的urls.py 中导入from django.conf import settings :)

我不确定我理解了,这是一个答案还是一个问题,你说的应该做什么部分在哪里? - Nachshon Schwartz
1
你可以手动将其附加到urlpatterns中进行服务,或使用服务器来提供静态文件(在非DEBUG模式下运行Django项目时应该这样做)。这就像在Django 1.3之前提供静态文件一样。是的,最后一个是问题。那么当出现500响应时会抛出什么异常?只是好奇。 - Torsten Engelbrecht
太好了,解决了问题,我只是将那段代码添加到我的urls.py文件中,现在它完美地工作了...谢谢。 - Nachshon Schwartz
尚未处理。即将推出的Django版本(1.5)应该会更好地处理它。 - Torsten Engelbrecht
1
@PankajAnand 仍建议通过Apache直接提供静态文件,而不是通过Django。至少在您有生产流量运行的情况下,它将有助于性能。 - Torsten Engelbrecht
显示剩余4条评论

12

在Django 1.3中,如果你只是使用manage.py runserver进行测试,你可以添加"--insecure"选项,如staticfiles文档所述:

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

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


我可以确认这对于Django 1.5仍然有效。谢谢 :) - Caumons
谢谢。这最终是我解决问题所需要的全部内容。 - The Pied Pipes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接