命令错误:如果DEBUG为False,则必须设置settings.ALLOWED_HOSTS

186

我正在使用Django 1.6.5,并配置了以下设置:

DEBUG = True

当我将DEBUG = False并运行manage.py runserver时,我会收到以下错误:

CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False
我使用以下设置时出现相同的错误:
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

我该怎么修复这个问题?


2
检查一下你是否重新定义了 DEBUG = True。这可能只是一个糟糕的复制粘贴。我之所以到这里来,是因为我不小心取消了 DEBUG = False。 - Tms91
从下面的帖子来看,甚至没有一个解决这个问题的方案... - Conor
我在原始代码的版本与安装的Django版本不同的情况下遇到了相同的错误,我无意中在requirement.txt中更改了Django的版本,导致出现了这个问题。通过在requirement.txt中添加相同版本的Django并重新安装,问题得到了解决。 - prdip
18个回答

246

尝试

ALLOWED_HOSTS = ['*']

如果您没有防火墙或在公共局域网上,则安全性较低,但这是我使用的方法,而且它有效。

编辑:有趣的是,即使DEBUG = True,我也需要将其添加到我的几个1.8项目中。非常不确定为什么。

编辑:这是由于Django安全更新所致,如我的评论中所述。


我应该把代码放在哪里才能正确地使用,以避免浪费代码? - Малъ Скрылевъ
5
在项目的主文件夹中运行命令 grep ALLOWED_HOSTS . -ri,以查找正确的文件。在这种情况下,它是settings.py,但建议始终使用grep命令。 - Harald Nordgren
我应该把这个写在哪个文件里? - Mona Jalal
3
根据Django文档,ALLOWED_HOSTS的行为已被修改以解决DNS重新绑定攻击,这可能是未来必要的。 - Kye
正是我所需要的。Django版本:2.1.7,Python 3.6.7工作正常! - dclaudiud
显示剩余6条评论

80

你的解决方案可能是添加原始IP和/或主机名:

ALLOWED_HOSTS = [
  'localhost',
  '127.0.0.1',
  '111.222.333.444',
  'mywebsite.example']

需要满足的条件是主机头(如果启用了USE_X_FORWARDED_HOST,则为X-Forwarded-Host)应该与ALLOWED_HOSTS中的一个值匹配。


2
配置完成后,老好了重启就可以了... - Razaman

32

确保它没有在settings.py文件的后面被重新定义。默认设置如下:

ALLOWED_HOSTS = []


(译注:该句是对前文的补充说明,没有需要翻译的部分。)

1
错误信息会让人误入歧途,感谢您的发布。 - scharfmn

17

7
使用以下内容:
ALLOWED_HOSTS =  ['localhost', '127.0.0.1']

2

如果您正在使用PyCharm

此解决方案仅适用于使用不同的settings.py文件并设置环境变量的情况

我遇到了相同的问题,但在我的情况下,问题是我使用的是不同于默认值的settings.py文件(并已注释掉了我的整个原始settings.py),尽管我已经在我的manage.py中正确配置了它,但在PyCharm中我也必须通过我的环境变量进行配置:

Edit Run Configurations >> Environment Variables

enter image description here


2

如果你在使用 PyCharm,请检查你的 Django 服务器环境变量。你需要指定正确的 module.settings 文件。


2
这对我有效:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

1

我也遇到了同样的错误,并发现这是由于设置文件配置更改导致的。您需要按照以下方式配置一些内容。

请尝试:

在settings.py中

ALLOWED_HOSTS = ['*']

在manage.py中

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<your-project-name>.settings')


在 asgi.py 中。
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<your-project-name>.settings')

在 wsgi.py 中
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<your-project-name>.settings')

1
在我的情况下,我将settings.py拆分成base.pydevelopment.py并放在一个名为settings的文件夹中。它看起来像这样:
<name-of-your-project-app>/
├── __init__.py
├── asgi.py
├── settings
│   ├── __init__.py
│   ├── base.py
│   └── development.py
├── urls.py
└── wsgi.py

问题远比ALLOWED_HOSTS=...要大,因为python manage.py runserver没有识别任何设置。
解决方法是通过在命令行中运行以下命令来配置DJANGO_SETTINGS_MODULE: export DJANGO_SETTINGS_MODULE=decoupled_dj.settings.development 我认为这告诉Django,“嘿,去找我的设置文件development.py”。

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