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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:06:02