python 如何在DRF中使用基于异步函数的视图?

aurhwmvo  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(430)

由于Django现在支持异步视图,我尝试改变我的代码库,其中包含了很多基于函数的视图是异步的,但由于某些原因它不工作。

@api_view(["GET"])
async def test_async_view(request):
    ...
    data = await get_data()
    return Response(data)

当我向此端点发送请求时,收到一条错误消息,内容如下:
Assert错误:应从视图返回ResponseHttpResponseHttpStreamingResponse,但收到的却是<class 'coroutine'>
DRF还不支持异步视图吗?有没有别的方法可以让它工作?

6qqygrtg

6qqygrtg1#

到目前为止,DRF还不支持async “API视图”。这里是DRF社区中的一个开放的issue (#7260),它仍处于讨论阶段。
但是,Django提供了一个装饰器/ Package 器,允许我们使用**sync_to_async(...)** Package 器将同步视图/函数转换为异步。
例如,

@sync_to_async
@api_view(["GET"])
def sample_view(request):
    data = get_data()
    return Response(data)

注意,这里,sample_view(...)get_data(...)是同步函数。

nukf8bse

nukf8bse2#

我想你可以在DRF中使用这个装饰器

import asyncio
from functools import wraps

def to_async(blocking):
    @wraps(blocking)
    def run_wrapper(*args, **kwargs):
        return asyncio.run(blocking(*args, **kwargs))

    return run_wrapper

用法示例

@to_async
@api_view(["GET"])
async def sample_view(request):
    ...
1rhkuytd

1rhkuytd3#

您可以使用adrf执行此操作:

pip install adrf

然后添加到INSTALLED_APPS
x一个一个一个一个x一个一个二个x

相关问题