当 debug=False 时可能导致 Django 错误,而当 debug=True 时不存在

Posted

技术标签:

【中文标题】当 debug=False 时可能导致 Django 错误,而当 debug=True 时不存在【英文标题】:What could cause a Django error when debug=False that isn't there when debug=True 【发布时间】:2011-06-25 14:58:22 【问题描述】:

使用开发服务器,它适用于 debug=True 或 False。

在生产中,如果 debug=True,一切正常,但如果 debug=False,我会收到 500 错误,并且 apache 日志以导入错误结尾:“ImportError: cannot import name Project”。

导入中的任何内容都没有以调试为条件 - 唯一的代码是开发服务器是否应该提供静态文件(在生产中,apache 应该处理这个 - 并且这是单独测试并且工作正常)。

【问题讨论】:

您是在使用 2 个设置文件,还是在部署期间实际更改了 settings.py 的内容? 我有一个用于 dev 的 local_settings 覆盖了调试的设置 - 但我在生产中手动更改 settings.py 的内容以验证这是错误(它只是一个内部工具,所以我可以做那样的事情!)。 我在做python manage.py collectstatic 之前在做runserver 之前工作过 【参考方案1】:

只是说,我今天遇到了类似的错误,这是因为 Django 1.5 在设置中需要ALLOWED_HOSTS 参数。 您只需放置此行即可使其工作;)

...
ALLOWED_HOSTS = '*'
...

但是,请注意,您需要根据您的实际主机 (https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts) 正确设置此参数!

此列表中的值可以是完全限定名称(例如“www.example.com”),在这种情况下,它们将与请求的 Host 标头完全匹配(不区分大小写,不包括端口)。以句点开头的值可用作子域通配符:“.example.com”将匹配 example.com、www.example.com 和 example.com 的任何其他子域。 '*' 的值将匹配任何内容;在这种情况下,您有责任提供自己对 Host 标头的验证(可能在中间件中;如果是这样,则此中间件必须首先在 MIDDLEWARE_CLASSES 中列出)。

所以基本上,一旦你投入生产,最好使用这种类型的配置:

...
ALLOWED_HOSTS = [
    '.yourdomain.com',
]
...

感谢gertvdijk 指出这一点

【讨论】:

哇!!这个问题真的很老(2年前),你的答案是最近的(6小时前),你让我头疼。谢谢!这是我的赞成票:) 你也为我节省了一些时间。如果我在 2 月之后创建我的项目,我会看到我需要它,因为这不在 Beta 或 RC 中。对于其他感兴趣的人,它也可能会影响旧版本:djangoproject.com/weblog/2013/feb/19/security 这正是我的问题。默认的 settings.py 文件有 ALLOWED_HOSTS = [] 但将值更改为 ['*'] 解决了问题。 它也节省了我的时间,但有人知道原因吗? 不要这样做。这是你在那儿打开的安全漏洞!而是指定实际允许的 HTTP 主机。 Django 的这种设置和行为已经改变是有原因的。阅读:Practical HTTP Host header attacks【参考方案2】:

如果您在其中一个文件中有循环导入,就会发生这种情况。检查并查看您是否从 Project 中导入某些内容,然后从最初导入 Project 的原始文件中导入 Project 中的某些内容。

我最近遇到了同样的问题,重新排列我的一些导入有助于解决问题。

【讨论】:

是的 - 错误似乎与循环导入有关 - 但我很困惑为什么它会与 debug=True 一起工作?当然,您希望 debug=True 和 False 之间的唯一区别是调试信息 - 而不是 它是否有效 @willcritchlow - 是的,我也有同样的担忧,但我还没有找到后一个问题的答案。在 DEBUG=True 模式下可能存在一个错误,它正在静默处理异常? 除了循环引用之外,从 Django 1.6.2 开始,如果您尝试引用导入模块的变量,并且如果该变量不存在,则 DEBUG=True 不会崩溃,但 DEBUG=False将要。例如,试试这个import exampleapp.settings 然后settings.variable_that_doesnt_exist【参考方案3】:

如果您没有同时存在 500.html 和 404.html 模板,也会发生这种情况。仅仅 500 还不够好,即使对于不会产生 404 的 URI 也是如此!

【讨论】:

【参考方案4】:

我也有这个问题。尽管即使在设置 Allowed_hosts 并且已经拥有 404 和 500 个模板时它仍然存在。

我还检查了循环导入,但事实并非如此。

我终于让 django 生成了一个日志文件,https://***.com/a/15100463/1577916

我不小心留下了一个“get_host”函数,该函数现在存在于 Django 1.5 的 HttpRequest(更改为 HttpRequest.get_host())。

由于某种原因,Debug True OR False 没有引发错误。

【讨论】:

以上是关于当 debug=False 时可能导致 Django 错误,而当 debug=True 时不存在的主要内容,如果未能解决你的问题,请参考以下文章

当 DEBUG = False 时 Django 转义 javascript

为什么只有当Debug = False并且db在Heroku上设置为生产数据库时,django才会因服务器500而失败?

部署到 heroku 更改 DEBUG = False 导致 500 错误

Django DEBUG=False 导致所有请求出现 400 错误

Django Elasticbeanstalk:当 Debug = False 时无法访问静态文件

当 DEBUG=False 时,我的 Django 管理面板给出服务器错误(500)