Django 找不到带有 Debug=False 和 Allowed_Hosts 的静态文件

Django can't find staticfiles with Debug=False and Allowed_Hosts

大家好,我无法解决这个问题:如果我将 DEBUG 设置为 False,我将无法 运行 manage.py 运行server:

CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False

然后,假设我向 ALLOWED_HOSTS 添加了一些内容:

ALLOWED_HOSTS = ['*']
or
ALLOWED_HOSTS = ['localhost']
or
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

现在,我可以执行“manage.py 运行服务器”,但静态文件不起作用。奇怪。

如果我将 DEBUG 设置为 True,那么它将 ALLOWED_HOSTS 设置为空、localhost 或 *。所以,我想问题与调试有关。没看懂

DEBUG 模式下,Django 开发服务器会为您处理提供静态文件。然而,这对于生产来说并不是最好的,因为它比真正的服务器效率低得多。参见 here

Serving the files

In addition to these configuration steps, you’ll also need to actually serve the static files.

During development, if you use django.contrib.staticfiles, this will be done automatically by runserver when DEBUG is set to True (see django.contrib.staticfiles.views.serve()).

This method is grossly inefficient and probably insecure, so it is unsuitable for production.

See Deploying static files for proper strategies to serve static files in production environments.

查看 here 了解如何在生产中提供静态文件。

编辑:添加以下内容以回答@alejoss 关于使用 DEBUG=True 查看错误页面的问题。

我在根 urls.py 文件中添加了如下内容:

if settings.DEBUG:
    urlpatterns += patterns(
        '',
        url(r'^400/$', TemplateView.as_view(template_name='400.html')),
        url(r'^403/$', TemplateView.as_view(template_name='403.html')),
        url(r'^404/$', 'django.views.defaults.page_not_found'),
        url(r'^500/$', 'django.views.defaults.server_error'),
    )

您可能需要稍作改动(即,如果您的模板名称不同,可能需要编辑 400403 页面)。基本上,这可以让您访问 http://localhost/400 查看 400 错误页面,http://localhost/403 查看 403 错误页面,等等。

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

manage.py runserver --insecure

好的这是非常干净的解决方案。你需要使用

DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = True

通过这种方式,您可以在日志中看到问题所在。 Whitenoise returns 500 通常是在缺少某些文件时。

您可以查看日志中缺少的内容。在我的例子中,heroku 日志就足够了。

更多信息:https://docs.djangoproject.com/en/2.0/ref/settings/#debug-propagate-exceptions