使用python-decouple设置ALLOWED_HOSTS时出现“Invalid HTTP_HOST header:'127.0.0.1:8000'”错误

5

当我的 settings.py 文件中有 ALLOWED_HOSTS = [] 时,服务器能正常工作。但是当我使用 ALLOWED_HOSTS = config('ALLOWED_HOSTS') 时,会出现以下错误:

DisallowedHost at /admin/login/
Invalid HTTP_HOST header: '127.0.0.1:8000'. You may need to add '127.0.0.1' to ALLOWED_HOSTS.

然而,当我进入Python shell时,我成功地能够导入ALLOWED_HOSTS - 并且它输出了[],这是正确的值。

有什么原因我仍然会收到错误信息吗?

PS: configpython-decouple包的一个功能 - 用于存储敏感值。


DEBUG 是真还是假? - Alasdair
DEBUG is set to True - Zorgan
2个回答

5

python-decouple的readme建议将ALLOWED_HOSTS转换为列表。它给出的示例是:

os.environ['ALLOWED_HOSTS'] = '.localhost, .herokuapp.com'
config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])

您似乎正在执行config('ALLOWED_HOSTS'),因此您的ALLOWED_HOSTS可能被评估为字符串'[]'而不是空列表[]


config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')]) 修复了问题 - 谢谢。 - Zorgan

3
在这种情况下,Django 期望 ALLOWED_HOSTS 中是一个列表,但环境变量只是纯文本,您需要在使用前将其转换。幸运的是,Python decouple 有一个名为 cast 的可选参数。
考虑以下 .env 文件:
ALLOWED_HOSTS=127.0.0.1, .herokuapp.com
DEBUG=True
PORT=5403

要在setting.py中访问这些值,您需要导入util类Csv,它将把普通字符串转换为列表。但要注意在.env文件或环境变量中,不要忘记用逗号和空格(,)将值分开。

对于内置类型,您不需要导入任何其他类,可以使用int,str,bool ...

setting.py

from decouple import config, Csv

ALLOWED_HOSTS = config('ALLOWED_HOSTS', default=[], cast=Csv())
DEBUG = config('DEBUG', default=False, cast=bool)
PORT= config('PORT', cast=int)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接