You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework/PostgreSQL容器化:Disallowed Host错误求助

解决Docker部署Django REST Framework时的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:01:33