HTTP_HOST标头无效:' 127.0.0.1:8000'使用python-decouple设置ALLOWED_HOSTS时出错

时间:2018-03-01 11:44:05

标签: python django

当我的settings.pyALLOWED_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包的一项功能 - 用于存储敏感值。

2 个答案:

答案 0 :(得分:1)

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可能会被评估为字符串'[]',而不是空列表[]

答案 1 :(得分:1)

在这种情况下,django期望ALLOWED_HOSTS中有一个列表,但环境变量只是一个计划文本,你必须在使用之前进行转换,幸运的是python decouple有一个名为cast的可选参数

考虑以下.env文件:

.ENV

ALLOWED_HOSTS=127.0.0.1, .herokuapp.com
DEBUG=True
PORT=5403

要在settings.py中访问这些值,您必须导入util类Csv,它将在列表中转换计划字符串,但要注意.env文件或环境变量时不要忘记将值分开用逗号和空格(,)。 对于内置类型,您不需要导入任何aditional类,您可以使用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)