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

Docker中Django API通过Python脚本连接时出现[Errno 111]连接拒绝错误

问题排查与解决方案

你的核心问题是Docker容器内的Django API能被浏览器访问,但Python脚本连接失败报Connection refused,以下是针对性排查步骤:

1. 检查Docker端口映射是否正确

  • 确认启动容器时执行了端口映射命令,例如:
    docker run -p 8000:8000 [你的镜像名/容器名]
    
  • 用docker ps查看容器状态,检查PORTS列是否显示类似0.0.0.0:8000->8000/tcp,这表示宿主机的8000端口已映射到容器内的8000端口。如果没有这行,说明端口未映射,宿主机无法访问容器内服务。

2. 确保Django服务监听容器内所有网卡

  • Django默认runserver只监听127.0.0.1,仅容器内部可访问,外部(包括宿主机)无法连接。启动Django时必须指定监听所有网卡:
    python manage.py runserver 0.0.0.0:8000
    
  • 可以进入容器内部执行netstat -tulpn,确认服务是否监听0.0.0.0:8000而非仅127.0.0.1:8000。

3. 修正HTTPS配置不匹配问题

  • 浏览器能访问https://127.0.0.1:8000,但Django默认runserver是HTTP服务,大概率是你用了反向代理(如Nginx)处理HTTPS,而容器内的Django实际跑在HTTP上。
  • 先修改Python脚本的BASE_URL为http://127.0.0.1:8000测试,若能成功连接,说明脚本直接访问HTTPS是错误的,应该对应容器内服务的协议。

4. 修复URL拼接的冗余斜杠问题

  • 你的脚本中BASE_URL+"/"+ENDPOINT会生成https://127.0.0.1:8000//norm/status/(两个连续斜杠),虽然多数服务器会兼容,但可能引发异常。改为以下两种方式之一:
    # 方式1:ENDPOINT开头不加斜杠,直接拼接
    BASE_URL='https://127.0.0.1:8000'
    ENDPOINT='norm/status/'
    resp=requests.get(f"{BASE_URL}/{ENDPOINT}", verify=False, headers=headers)
    
    # 方式2:ENDPOINT开头加斜杠,直接拼接
    BASE_URL='https://127.0.0.1:8000'
    ENDPOINT='/norm/status/'
    resp=requests.get(f"{BASE_URL}{ENDPOINT}", verify=False, headers=headers)
    

5. 排除无关配置干扰

  • django-cors-headers是解决浏览器跨域请求的,和Python脚本的连接拒绝问题无关,无需在这个方向浪费时间。

内容的提问来源于stack exchange,提问作者user23329619

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:47:44