为何在AWS Ubuntu服务器的Django应用中,requests.get获200响应却无内容?
我之前也碰到过几乎一模一样的情况,咱们一步步来排查和解决这个问题:
1. 先确认服务器内部的网络连通性
先抛开Django应用,直接在Ubuntu服务器上用curl测试你的DRF接口,模拟和代码里一样的请求:
curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" http://你的DRF接口完整地址
- 如果
curl也拿不到响应:那大概率是DRF接口本身的问题——比如接口服务没启动、绑定的是127.0.0.1而非0.0.0.0(导致同一服务器上的其他进程访问不到)、服务器内部防火墙挡住了接口端口,或者DRF所在的Django项目ALLOWED_HOSTS没配置允许当前服务器的IP/localhost。 - 如果
curl能正常拿到响应:那问题就出在Django应用的运行环境或者代码细节上。
2. 排查应用运行环境和shell环境的差异
你在./manage.py shell里能成功,说明shell用的是正确的Python环境,但部署的Django应用(比如用uWSGI、Gunicorn运行的)可能和shell环境不一样:
- 检查虚拟环境:确认应用运行时用的Python路径和shell里的一致。可以在应用代码里加一句
print(requests.__version__),再在shell里运行import requests; print(requests.__version__),对比版本是否相同——不同版本的requests可能存在行为差异。 - 检查环境变量:应用运行时可能继承了系统的代理配置,而shell里没有。可以在代码里打印代理信息:
print(requests.utils.get_environ_proxies("你的接口地址")),如果输出非空,说明有意外代理在干扰请求。
3. 核对请求细节的一致性
别小看细节,有时候就是差一点导致失败:
- 确认请求URL完全正确:比如shell里用的是
http://localhost:8000/api/,但应用里写成了http://127.0.0.1:8000/api(少了末尾的斜杠)?虽然多数情况下不影响,但某些DRF路由配置会对斜杠敏感。 - 对比请求头:在shell里打印完整请求头:
然后在应用代码里也打印请求的headers,看看两者是否完全一致——有时候应用框架会自动添加额外的头,或者不小心覆盖了你设置的User-Agent。r = requests.get(url, verify=False, headers=headers) print(r.request.headers)
4. 捕获具体错误信息,别只看“拿不到内容”
在应用代码里加异常捕获,把错误信息打出来,这是最直接的排查方式:
import requests headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} try: response = requests.get(url='你的接口地址', verify=False, headers=headers) print(f"请求状态码: {response.status_code}") print(f"响应内容: {response.text[:500]}") # 打印前500字符看大概内容 except Exception as e: print(f"请求出错详情: {str(e)}")
同时别忘了查看DRF接口的日志,看看有没有接收到这个请求,以及返回了什么状态码(比如403、500这类隐性错误)。
5. 关于verify=False的小提醒
虽然你加了这个参数跳过证书验证,但如果DRF接口用的是HTTPS,服务器上的CA证书链异常也可能导致请求失败——可以临时把接口改成HTTP(如果允许的话)测试,排除证书相关的干扰。
内容的提问来源于stack exchange,提问作者tommyshere
相关产品推荐
相关产品推荐

