如何测试异步 Django Rest 框架

问题描述 投票:0回答:1

我在使用 adrf 库在 django Rest 框架中测试异步模式时遇到问题。 我用视图创建了一个 django 项目:

from rest_framework.decorators import api_view as sync_api_view

@sync_api_view(['GET'])
def my_not_async_view(request):
    print('before block endpoint')
    time.sleep(15)
    return Response({"message": "my_async_view"})

我用 uvicorn 运行这段代码:

uvicorn async_django.asgi:application --workers=1
并用curl

进行测试
for x in `seq 1 3`; do time curl http://localhost:8000/async-test/not-async & done; echo Starting

我希望控制台日志结果为(#1):

before block endpoint
and after 15 sec another
before block endpoint

但实际结果是(#2):

before block endpoint
before block endpoint # runs in another thread
before block endpoint # runs in another thread

为什么我希望结果是(#1)?因为我想测试异步模式并确保异步模式处理我的请求,而不是项目的线程/实例:

import asyncio
from adrf.decorators import api_view

@api_view(['GET'])
async def get_async_response(request):
    print("async code is running")

    await asyncio.sleep(10)
    return Response({"message": "async_result"})

所以我的逻辑是,当我向

my_not_async_view
发送请求时,我不应该在1次调用后看到
before block endpoint
,直到它给出响应,因为它应该阻止我的项目,但是当我向
get_async_response
发送请求时,我我发送请求后应该能够多次看到
async code is running
...

python django django-rest-framework async-await uvicorn
1个回答
0
投票

使用gunicorn代替uvicorn

gunicorn async_django.wsgi:application
© www.soinside.com 2019 - 2024. All rights reserved.