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

Django中基于类的视图(CBV)实现异步视图报错排查

问题原因

你的TestView继承了同步的viewsets.ViewSet,DRF的同步视图基类无法正确处理异步方法(async def list),会直接返回协程对象而非等待其执行完成后返回响应,这就触发了断言错误。

解决方法

方法一:升级DRF并使用异步ViewSet基类

DRF 3.14及以上版本支持异步ViewSet,先升级DRF:

pip install --upgrade djangorestframework

修改views.py,替换视图基类,并修正查询集的写法:

from rest_framework import viewsets
from django.http import HttpResponse
import logging
import asyncio
from .models import Post

class TestView(viewsets.AsyncViewSet):
    LOG = logging.getLogger('test')
    async def list(self, request, *args, **kwargs):
        self.LOG.info("async method start!!")
        queryset = Post.objects.none()  # 注意添加括号,调用方法获取空查询集
        await asyncio.sleep(3)
        return HttpResponse("Hello async world!")

方法二:改用Django原生异步CBV

若不想升级DRF,可直接使用Django原生异步类视图,并调整路由配置:
修改views.py:

from django.views import View
from django.http import HttpResponse
import logging
import asyncio
from .models import Post

class TestView(View):
    LOG = logging.getLogger('test')
    async def get(self, request, *args, **kwargs):
        self.LOG.info("async method start!!")
        queryset = Post.objects.none()
        await asyncio.sleep(3)
        return HttpResponse("Hello async world!")

修改urls.py,直接绑定路由到该视图:

from django.contrib import admin
from django.urls import re_path
from blog.views import TestView

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'async_view/test/', TestView.as_view()),
]
额外注意事项
  • 确保Django版本≥3.1(Django 3.1及以上才支持异步视图)
  • 保持asgi.py的配置正确,使用ASGI服务器(如uvicorn)运行项目

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:43:15