Django开发服务器中DRF接口自调用请求卡住问题求助
问题原因及解决办法
核心原因
Django开发服务器(manage.py runserver)默认是单线程运行的——尽管官方文档提到它支持多线程,但默认配置下仅启动1个工作线程。
你的场景里,View2的请求占用了唯一的线程,当它发起对View1的请求时,服务器没有空闲线程处理这个新请求,导致请求队列阻塞,最终View2会一直卡在等待View1响应的环节,形成死锁。
另外,你的代码还有一个潜在问题:如果client是requests.Session(同步HTTP客户端),用await调用它的get方法是错误的——requests是同步库,不支持异步await,必须改用异步HTTP客户端(比如aiohttp.ClientSession)才能正确实现异步请求。
解决办法
启动多线程开发服务器
运行服务器时手动指定线程数,比如启动4个线程:python manage.py runserver --threads 4这样当View2发起请求时,有额外线程可以处理View1的请求,避免阻塞。
修复异步客户端的使用问题
替换同步HTTP客户端为异步客户端,比如aiohttp,修改后的get_response方法示例:import aiohttp from asgiref.sync import async_to_sync # ... 其他视图代码 ... @async_to_sync async def get_response(self): async with aiohttp.ClientSession() as session: async with session.get("http://localhost:8000/api/view1") as response: return await response.json()建议在异步上下文内创建
ClientSession,更符合异步编程规范。高效替代方案(可选)
既然两个视图属于同一个Django项目,没必要通过HTTP请求调用,直接复用View1的业务逻辑代码更高效:def get_view1_result(): return {"message": "Success!"} class View1(APIView): def get(self, request, *args, **kwargs): return Response(get_view1_result()) class View2(APIView): def get(self, request, *args, **kwargs): result = get_view1_result() if result.get("message") == "Success!": return Response("Success!") return Response("Failed!")这种方式既避免了跨请求的开销,也从根源上消除了线程阻塞问题。
内容的提问来源于stack exchange,提问作者Luiz F. Bianchi
相关产品推荐
相关产品推荐

