【问题标题】:What could cause a Django error when debug=False that isn't there when debug=True当 debug=False 时可能导致 Django 错误,而当 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 之前工作过

标签: python django apache debugging importerror


【解决方案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://stackoverflow.com/a/15100463/1577916

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 2013-12-03
      • 2021-08-13
      • 2021-11-05
      • 2013-11-21
      • 2021-10-30
      • 1970-01-01
      • 2013-03-25
      • 2018-09-26
      相关资源
      最近更新 更多