如何让Django Rest Apis异步

rkttyhzu  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(260)

以下是我的Django应用程序配置:

django = 2.2.11
djangorestframework = 3.9.2
Python = 3.8.2

我为react js前端公开了一组Rest API,它使用分层架构views (controller) - services - data_layer连接到Postgres。在数据层,我使用Connection.Cursor读取数据,然后使用cursor.fetchall转换读取的数据。
默认情况下,其余的api都是同步api,我正在努力想办法让它们异步,这样可以增加系统的可扩展性,否则每次调用都会阻塞主线程。
我已尝试以下选项:
1.使用asyncio库,但我无法使完整的调用链异步。我通常会得到一个错误,预期返回的是Response / HttpResponse,但该方法返回的是Co-routine。我可以找到包含以异步方式运行简单方法的示例,但没有Django Rest API的示例
1.尝试了以下link,它们使用线程池执行器来隔离控制器本身中线程上的每个调用,但挑战在于在Main方法中的何处进行Asyncio调用(如链接中所示),因为这些API是从外部调用的。

  1. aiohttp能帮上忙吗,不确定,但如果有人有一个例子,否则我不得不求助于服务代理设计,使用像Redis这样的中介,在我看来这是不必要的复杂性。
    任何关于这个主题的帮助/链接将不胜感激。
c3frrgcw

c3frrgcw1#

如果你的Django应用程序只是阅读数据库,那么异步操作不可能提供任何加速,因为Django的ORM不是异步的(在写这篇文章的时候是4.1版本)。所有异步视图/控制器最终都会阻塞非异步数据库查询。
如果你在视图/控制器中调用其他的Web服务(HTTP),你可以让它们异步,使用aiohttp或httpx,但是DRF(还)不支持异步视图,所以必须给予。要么使用Django异步而不使用DRF,要么保持DRF并保持同步。
有关DRF中异步的详细讨论,请参见https://github.com/encode/django-rest-framework/discussions/7774

相关问题