【问题标题】:Django gives Bad Request (400) when DEBUG = False当 DEBUG = False 时,Django 给出错误请求(400)
【发布时间】:2021-10-30 13:07:11
【问题描述】:

我是 django-1.6 的新手。当我使用DEBUG = True 运行 django 服务器时,它运行良好。但是当我在设置文件中将DEBUG 更改为False 时,服务器停止了,它在命令提示符下给出了以下错误:

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

在我将ALLOWED_HOSTS 更改为["http://127.0.0.1:8000",] 后,在浏览器中出现错误:

Bad Request (400)

是否可以在没有调试模式的情况下运行 Django?

【问题讨论】:

  • 要记住的一点:不要在ALLOWED_HOSTS中添加“http”或“https”

标签: python django


【解决方案1】:

ALLOWED_HOSTS list 应该包含完全限定的主机名不是 url。省略端口和协议。如果您使用的是127.0.0.1,我也会将localhost 添加到列表中:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

您也可以使用* 来匹配任何主机:

ALLOWED_HOSTS = ['*']

引用文档:

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

我的粗体强调

您收到的状态 400 响应是由于当您的主机标头与该列表中的任何值都不匹配时引发了 SuspiciousOperation exception

【讨论】:

  • 感谢它有效,但是当我设置为 False 时,出现了一个问题,因为所有静态文件都显示为 404。我不明白为什么它给出了 not found
  • @MegaBytes:抱歉,我不知道那可能是什么。
  • 你能建议我怎么做吗,因为我的项目正在生产中。
  • @MegaBytes 当 DEBUG 为 False 时,所有静态文件都从 STATIC_ROOT 提供,所以./manage.py collectstatic 可能会这样做。
  • 我一直试图弄清楚为什么我的运行状况检查在 AWS 上出现了近一周的 400 个错误 - 这个答案就是解决方案。五年后,但非常感谢!
【解决方案2】:

对我来说,我没有将 USE_X_FORWARDED_HOST 设置为 true 就收到了这个错误。来自文档:

仅当设置此标头的代理正在使用时才应启用。

我的托管服务wrote 在他们的文档中明确指出此设置必须 被使用,如果我忘记了,我会收到这个 400 错误。

【讨论】:

  • 如果 ALLOWED_HOSTS = ['*'] 是否有必要这样做?
  • 我认为 ALLOWED_HOSTS 会阻止整个主机。 USE_X_FORWARDED_HOST 仅确定是否使用 HTTP 标头。
【解决方案3】:

我遇到了同样的问题,但没有一个答案能解决我的问题。为了解决此类情况,最好通过将以下配置临时添加到 settings.py 来启用日志记录。

LOGGING = {
   'version': 1,
   'disable_existing_loggers': False,
   'handlers': {
      'file': {
         'level': 'DEBUG',
         'class': 'logging.FileHandler',
         'filename': '/tmp/debug.log',
      },
   },
   'loggers': {
      'django': {
         'handlers': ['file'],
         'level': 'DEBUG',
         'propagate': True,
      },
   },
}

当你看到问题时,它比盲目调试更容易处理。

我的问题是:

HTTP_HOST 标头无效:“pt_web:8000”。根据 RFC 1034/1035,提供的域名无效。

我通过在 Nginx 配置文件中添加 proxy_set_header Host $host; 并在 settings.py 中使用 USE_X_FORWARDED_PORT = True 启用端口转发来解决它(这是因为在我的情况下,我正在监听 Nginx 端口 8080 上的请求并传递给 @ 987654327@ 在端口 8000)。

【讨论】:

  • 感谢分享。对于我在 prod 中的情况,在添加 LOGGING=... 之后,我会看到错误“ValueError: Missing staticfiles manifest entry for...css”。然后我使用@Blackeagle52上面提到的“python manager.py collectstatic”,500错误(在我的本地开发中也可以是400错误)解决了。
【解决方案4】:

我遇到了同样的问题,我通过设置ALLOWED_HOSTS = ['*'] 解决了这个问题,为了解决静态图像的问题,您必须像这样更改环境配置中的虚拟路径:

虚拟路径 目录

/static/                         /opt/python/current/app/yourpj/static/
/media/                        /opt/python/current/app/Nuevo/media/

希望对你有帮助。

PD:抱歉我的英语不好。

【讨论】:

    【解决方案5】:

    在项目的 settings.py 中,检查第 28 行,允许主机在哪里

    settings.py

    
    ALLOWED_HOSTS = ['IP', 'servidor', ]
    

    你必须把你使用的IP和服务器,本地或web级别 设置.py

    ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'www.ejemplo.com']
    

    ALLOWED_HOSTS = ['*']
    

    【讨论】:

      【解决方案6】:

      对我来说,我已经在 127.0.0.1 上安装了 xampp,在 127.0.1.1 上安装了 django 我一直在尝试添加主机

      ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'www.yourdomain.com', '*', '127.0.1.1']
      

      我得到了同样的错误或 (400) 错误请求

      所以我将 url 更改为 127.0.1.1:(the used port)/project 瞧!

      你必须检查你的虚拟网络地址是什么,因为我在 Linux 上使用 bitnami django stack 2.2.3-1 我可以检查 django 正在使用哪个端口。 如果您有错误(400 错误请求),那么我猜 django 在不同的虚拟网络上.. 祝你好运

      【讨论】:

        【解决方案7】:

        在您的设置文件中使用DEBUG = False,您还需要设置 ALLOWED_HOST 列表。 尝试包括ALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

        否则你可能会收到来自 django 的 Bad Request(400) 错误。

        【讨论】:

          【解决方案8】:

          我必须先停止 apache 服务器。

          (例如sudo systemctl stop httpd.service / sudo systemctl disable httpd.service)。

          除了编辑'settings.py'文件之外,这解决了我的问题

          ALLOWED_HOSTS = ['se.rv.er.ip', 'www.example.com']

          【讨论】:

            【解决方案9】:

            试试manage.py collectstatic。 更新后我丢失了一个静态文件,因此请求错误。

            【讨论】:

              【解决方案10】:

              尝试使用--insecure 标志运行您的服务器,就像这样:

              python manage.py runserver --insecure
              

              【讨论】:

                【解决方案11】:

                导航到设置并找到 base.py 文件 将允许的主机设置为 ALLOWED_HOSTS = ['*']

                【讨论】:

                • 不要重复接受的答案。删除此以保持论坛干净
                • 不要这样回答,评论一下
                猜你喜欢
                • 2013-11-21
                • 2016-03-11
                • 2018-01-07
                • 2021-08-29
                • 2017-01-20
                • 2021-08-13
                • 1970-01-01
                • 2017-09-19
                • 1970-01-01
                相关资源
                最近更新 更多