Django服务运行后出现递归深度超出错误,Postman请求正常
Django服务中requests.delete触发递归深度超出的问题分析
是否由requests库导致?
不是requests库本身的bug,更可能是服务内部的请求循环调用或requests会话/连接池资源泄漏引发的异常:
- 如果你的Django视图调用
apiUrlAddEntries指向的接口后,该接口又间接调用回当前视图,就会形成递归调用链,触发maximum recursion depth exceeded错误。 - 长时间运行后,requests的连接池资源未正确释放,可能导致内部处理逻辑出现异常递归。
为什么Postman正常但requests调用不行?
- Postman是外部独立客户端,直接调用目标接口时,不会触发你Django服务内部的代码循环。只有服务内部通过requests发起请求时,才会进入递归调用链。
- Postman的HTTP客户端实现和requests库完全独立,不受你服务内requests会话资源泄漏的影响,因此能正常执行请求。
排查与解决建议
- 检查循环调用链:确认
apiUrlAddEntries是否指向当前服务的接口,且该接口是否会间接调用发起delete请求的视图,若存在循环则重构逻辑打破闭环。 - 避免复用会话对象:每次请求创建新的requests会话,防止资源泄漏,修改代码如下:
with requests.Session() as session: response = session.delete(apiUrlAddEntries, verify=False) return response - 临时验证递归问题:可临时调高递归深度上限(不推荐长期使用),添加代码:
import sys sys.setrecursionlimit(1500) # 仅用于验证是否为循环调用导致 - 排查资源泄漏:使用
memory_profiler等工具检测长时间运行后,是否有未释放的requests会话、连接资源。
内容的提问来源于stack exchange,提问作者Nightrain
相关产品推荐
相关产品推荐

