Django REST Framework/PostgreSQL容器化:Disallowed Host错误求助
嘿,我来帮你搞定这个问题!当你用sudo docker-compose up启动DRF和PostgreSQL容器时遇到的Disallowed Host错误,本质是Django的安全校验机制在起作用——它会检查请求的Host头是否在预设的允许列表里,而Docker环境下的网络配置很容易触发这个限制。
先看看你提供的配置片段:
Dockerfile
FROM python:3.6 ENV PYTHONUNBUFFERED 1 RUN mkdir /agent-technologies WORKDIR /agent-technologies COPY . /agent-technologies RUN pip install -r requirements.txt EXPOSE 8000
docker-compose.yml(片段)
version: '3' services: db: image: postgres environment: - POSTGRES_USER=stefan_radonjic - POSTGRES_PASSWORD=cepajecar995 # 你的配置内容在这里截断了,不过不影响核心问题的解决
下面是具体的解决步骤:
第一步:修改Django的settings.py配置
找到项目里的settings.py,定位到ALLOWED_HOSTS这一行。如果是本地测试阶段,你可以直接把它改成:ALLOWED_HOSTS = ['*'](⚠️ 注意:生产环境绝对不能这么做!生产环境要写死具体的域名或IP,比如
ALLOWED_HOSTS = ['your-domain.com', '192.168.1.100', 'localhost'])这么做是告诉Django接受来自任何主机的请求,直接绕过本地测试时的Host校验。
第二步:确保Docker容器的启动命令和端口映射正确
你的docker-compose.yml里应该还有一个web服务(用你写的Dockerfile构建),记得给它加上正确的启动命令和端口映射:services: web: build: . # 必须用0.0.0.0让容器监听所有接口,否则外部访问不到 command: python manage.py runserver 0.0.0.0:8000 ports: - "8000:8000" depends_on: - db这里的关键是
runserver 0.0.0.0:8000,如果用默认的127.0.0.1:8000,容器内部的服务只能自己访问,外部请求根本进不去,也会间接触发Disallowed Host错误。第三步:重新构建并启动容器
先停止现有容器:sudo docker-compose down然后重新构建镜像并启动服务,确保修改后的
settings.py被复制到容器里:sudo docker-compose up --build
额外补充(生产环境注意)
如果是生产部署,除了设置具体的ALLOWED_HOSTS,如果用Nginx做反向代理,还要在Django的settings.py里加上:
USE_X_FORWARDED_HOST = True # 如果用HTTPS的话,还要加下面这行 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
这样Django才能正确识别来自Nginx的真实Host头。
内容的提问来源于stack exchange,提问作者Stefan Radonjic

