当我的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:config
是python-decouple
包的一项功能 - 用于存储敏感值。
答案 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)