Django RestFramework是否支持异步视图和类?遇到协程报错如何解决?
DRF异步视图&类支持说明与报错解决方案
版本支持说明
Django REST Framework 从3.10版本开始新增异步视图支持,3.12及之后版本对类视图的异步支持趋于稳定。使用异步功能前需确保基础依赖版本符合要求:Django版本≥3.1(Django原生异步支持最低版本),DRF版本≥3.12。
报错原因
你遇到的AssertionError: Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view, but received a <class 'coroutine'>报错,核心原因是定义了异步视图/类方法,但DRF没有正确识别异步逻辑,把未执行的协程对象直接当成了返回值。常见触发场景包括:
- 给普通的APIView方法直接加
async修饰,但没有用DRF提供的异步适配装饰器 - 用函数式异步视图时没有开启ASGI运行环境
- 类视图中仅对单个动作方法加
async,未做全局适配
正确实现方案
1. 异步函数视图实现
直接用@api_view装饰器搭配async修饰即可,示例代码:
from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['GET']) async def async_view(request): # 此处可写入异步逻辑,比如异步查询数据库、调用异步第三方接口 data = {"message": "异步视图返回成功"} return Response(data)
2. 异步类视图实现
基础AsyncAPIView用法
from rest_framework.views import AsyncAPIView from rest_framework.response import Response class MyAsyncView(AsyncAPIView): async def get(self, request): # 异步逻辑实现 data = {"method": "GET", "type": "异步类视图"} return Response(data) async def post(self, request): data = {"method": "POST", "content": request.data} return Response(data)
视图集异步动作用法
from rest_framework.viewsets import ViewSet from rest_framework.decorators import async_action from rest_framework.response import Response class MyAsyncViewSet(ViewSet): @async_action(methods=['GET'], detail=False) async def get_async_data(self, request): result = await some_async_operation() return Response({"data": result})
运行要求
- 必须使用ASGI服务器运行项目,比如Uvicorn、Daphne,不能用传统的WSGI服务器(比如Gunicorn默认配置、Django自带runserver默认模式)
- 依赖版本符合要求的前提下,无需额外修改Django配置项即可正常使用异步功能
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

