我在使用 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
...
使用gunicorn代替uvicorn
gunicorn async_django.wsgi:application