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

Django开发服务器中DRF接口自调用请求卡住问题求助

问题原因及解决办法

核心原因

Django开发服务器(manage.py runserver)默认是单线程运行的——尽管官方文档提到它支持多线程,但默认配置下仅启动1个工作线程。

你的场景里,View2的请求占用了唯一的线程,当它发起对View1的请求时,服务器没有空闲线程处理这个新请求,导致请求队列阻塞,最终View2会一直卡在等待View1响应的环节,形成死锁。

另外,你的代码还有一个潜在问题:如果client是requests.Session(同步HTTP客户端),用await调用它的get方法是错误的——requests是同步库,不支持异步await,必须改用异步HTTP客户端(比如aiohttp.ClientSession)才能正确实现异步请求。

解决办法

  1. 启动多线程开发服务器
    运行服务器时手动指定线程数,比如启动4个线程:

    python manage.py runserver --threads 4
    

    这样当View2发起请求时,有额外线程可以处理View1的请求,避免阻塞。

  2. 修复异步客户端的使用问题
    替换同步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,更符合异步编程规范。

  3. 高效替代方案(可选)
    既然两个视图属于同一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:05:16