Django异步视图adrf解决办法

提问

在Django编写异步视图的时候会出现

AssertionError: Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view

或者

TypeError: sync_to_async can only be applied to sync functions.

诸如此类的错误的时候一般发生在异步视图中

python 复制代码
class NewView(APIView):
    permission_classes = [AllowAny]

    async def post(self, request, *args, **kwargs):
        # 异步操作模拟
        result = await self.long_running_task()
        return Response({"message":result})

    async def long_running_task(self):
        # 模拟一个耗时的异步任务
        await asyncio.sleep(2)
        return "Completed long-running task"

解答

这里需要引入 adrf 的视图方法,使用之前需要使用pip进行安装。

bash 复制代码
pip install adrf

为了保证不和原有的视图命名冲突这里重命名一下 adrfAPIView

python 复制代码
from adrf.views import APIView as adrfAPIView


class NewView(adrfAPIView):
    permission_classes = [AllowAny]

    async def post(self, request, *args, **kwargs):
        # 异步操作模拟
        result = await self.long_running_task()
        return Response({"message":result})

    async def long_running_task(self):
        # 模拟一个耗时的异步任务
        await asyncio.sleep(2)
        return "Completed long-running task"

这段代码展示了如何使用adrf(异步Django REST Framework)实现一个异步的API视图。adrf扩展了Django REST Framework,支持异步请求处理,从而提高了在处理大量I/O密集型操作时的性能。在这个例子中,NewView视图继承自adrfAPIView,它处理一个POST请求,并执行一个模拟的异步任务。

视图类NewView定义了permission_classes = [AllowAny],表示该视图对所有用户开放,没有权限限制。然后,在post方法中,使用了async def来定义异步请求处理逻辑。该方法通过await调用了long_running_task方法,这是一个模拟耗时操作的异步函数,执行时会暂停2秒钟。任务完成后,返回一个包含任务结果的响应,表示任务已完成。

通过adrf库的支持,这个视图能够异步处理请求,提高了并发性能,尤其适用于需要等待外部服务响应或执行长时间任务的场景。

相关推荐
Rust语言中文社区7 小时前
【Rust日报】2026-05-14 Pyrefly v1.0 正式发布:快速的 Python 类型检查器和语言服务器
开发语言·后端·python·rust
2601_956139427 小时前
广州VI设计公司哪家强
linux·运维·服务器·python
GreenTea7 小时前
【Rust 2026教程:从零构建 Mini-OLAP 引擎】第 5 章 SQL → 逻辑计划 → 物理计划
后端
GreenTea7 小时前
【Rust 2026教程:从零构建 Mini-OLAP 引擎】第 4 章 哈希聚合:GROUP BY 的核心
后端
databook7 小时前
让数学公式自动推导
python·数学·动效
IT_陈寒7 小时前
Vue的v-for为什么不加key也能工作?我差点翻车
前端·人工智能·后端
GreenTea7 小时前
【Rust 2026教程:从零构建 Mini-OLAP 引擎】第 3 章 表达式系统:把 SQL 表达式变成可执行树
后端
m0_733565467 小时前
如何指定PHP版本运行phpMyAdmin_多版本共存配置
jvm·数据库·python
GreenTea7 小时前
【Rust 2026教程:从零构建 Mini-OLAP 引擎】第 2 章 向量化执行:让 CPU 跑满
后端
GreenTea7 小时前
【Rust 2026教程:从零构建 Mini-OLAP 引擎】第 1 章 列式存储:OLAP 的物理基石
后端