当DEBUG = False时,Django给出错误请求(400)


254

我是django-1.6的新手。当我使用运行django服务器时DEBUG = True,它运行良好。但是,当我改变DEBUGFalse在设置文件,然后在服务器停止,并让在命令提示符下以下错误:

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

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

Bad Request (400)

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


有一点要记住:不添加的“http”或“https”ALLOWED_HOSTS
shellbye

Answers:


415

ALLOWED_HOSTS列表应包含标准主机名而不是 URL。省略端口和协议。如果您使用127.0.0.1,我也将添加localhost到列表中:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

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

ALLOWED_HOSTS = ['*']

引用文档:

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

大胆强调我

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


3
谢谢,它的工作原理,但是当我设置为False时,一个问题来了,因为所有静态文件都显示为404。我不明白为什么找不到它
MegaBytes 2015年

@MegaBytes:对不起,我不知道那可能是什么。
马丁·皮特斯

1
您能建议我如何做吗,因为我的项目正在进行生产。
MegaBytes 2015年

同样,我什至不知道您要设置什么False。也许您可以发布一个新问题?
马丁·皮特斯

9
@MegaBytes当DEBUG为False时,所有静态文件都由STATIC_ROOT提供,因此./manage.py collectstatic可能会执行。
Blackeagle52 2015年

6

对我来说,我没有设置USE_X_FORWARDED_HOST为true便得到了这个错误。从文档:

仅当使用设置此标头的代理时,才应启用此功能。

我的托管服务在其文档中明确表示,该设置必须被使用,如果我忘了我得到这个400错误。


如果ALLOWED_HOSTS = ['*'],是否有必要?
Mike Stoddart

1
我认为ALLOWED_HOSTS会阻止整个主机。USE_X_FORWARDED_HOST仅确定是否使用HTTP标头。
基思

3

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

虚拟路径                 目录

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

希望对您有帮助。

PD:对不起,我的英语不好。


2

我遇到了同样的问题,没有一个答案可以解决我的问题,为了解决这种情况,最好通过在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, }, }, }

并尝试tail -f /tmp/debug.log。当您看到问题时,比盲目调试要容易得多。

我的问题即将

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

并通过添加解决它proxy_set_header Host $host;,以Nginx的配置文件,通过启用端口转发USE_X_FORWARDED_PORT = Truesettings.py(这是因为在我的情况我已经听过请求Nginx的端口8080,并把它传递给guni上港8000


感谢分享。对于我在prod中的情况,添加LOGGING = ...之后,我会看到错误“ ValueError:缺少... css的静态文件清单条目”。然后我使用@ Blackeagle52上面提到的“ python manager.py collectstatic”,解决了500错误(在我的本地dev中也可能是400错误)。
zhihong

1

对我来说,我已经在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 :(使用的端口)/ project和瞧!

您必须检查您的虚拟网络地址是什么,对我来说,因为我在Linux上使用bitnami django堆栈2.2.3-1,所以我可以检查django使用的端口。如果您有一个错误(400错误的请求),那么我猜django在不同的虚拟网络上..祝您好运 在此处输入图片说明


0

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

否则,您可能会收到来自django的Bad Request(400)错误消息。


0

尝试使用--insecure运行服务器,如下所示:

python manage.py runserver-不安全


0

我必须先停止apache服务器。

(fe sudo systemctl stop httpd.service/ sudo systemctl disable httpd.service)。

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.