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
相关产品推荐
相关产品推荐

