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
相关产品推荐
相关产品推荐

