姜戈·异步:有什么新鲜事,下一步是什么?

2020-08-15 02:54:53

所有你需要知道的关于异步支持的信息都在最新的Django 3.1中增加了。

从几周前发布的最新版本Django 3.1开始,Django现在完全支持异步请求路径。这对于自从安德鲁·戈德温的DEP 0009于2019年7月获得Django技术委员会批准以来一直在座位边缘等待的每个人来说都是令人兴奋的。如果您有Django应用程序在生产中并希望添加异步支持,请继续阅读以了解此版本意味着什么。在DeepSource,我们正致力于在Python分析器中添加更多Django问题,其中还将包括异步特定的错误风险和反模式。

在Django 3.1中,现在跨请求-响应周期支持异步功能。这意味着您可以使用Async关键字定义完全异步视图:

异步定义GET_CAT_FACTS(请求):";";";";返回随机CAT事实。";";";与aiohttp异步。ClientSession()作为会话:与会话异步。获取(';https://catfact.ninja/fact';)作为响应:DATA=等待响应。Json()返回数据。

其中最令人兴奋的是异步支持完全向后兼容。这意味着您可以使用异步和同步视图的任意组合,Django将保证始终在正确的执行上下文中执行。因此,如果您不想立即移植所有内容,只需拨动开关,只需添加一个异步视图,而不会对现有的同步代码进行任何速度倒退。

Def simple_midleware(Get_Response):异步def中间件(Request):#做一些有趣的事情响应=等待get_response(请求)返回响应返回中间件。

由于中间件可以支持同步和异步请求的任意组合,如果只支持一种类型的请求(就像上例中只支持异步请求),Django将尝试满足中间件的要求-但会以性能为代价。建议使用SYNC_AND_ASYNC_MIDDLEWARE修饰器来定义支持这两种请求的中间件。在文档中可以找到更多的例子。

Django的所有异步功能在WSGI和ASGI上都完全受支持-尽管如果您使用WSGI运行异步代码会有性能损失,并且长时间运行的请求效率不高。如果您想让您的同步代码在全新的异步视图和ASGI模式下很好地工作,建议使用sync_to_async修饰符。

如果您从视图执行大量外部HTTP调用,异步视图允许您在本地并行进行这些调用。这可能会带来很大的减速带,特别是如果您以前在同步视图中使用过异步代码的话。如果您的视图涉及作为请求路径的一部分进行的繁重计算或长时间运行的网络调用,这是使用异步视图的一个很好的用例。

ORM、缓存层和涉及长时间运行的网络调用的代码的其他几个部分还不支持异步。ORM中对异步特性的支持预计很快就会到来,因为它是初始DEP的一部分。像模板和缓存后端这样的功能将需要更多时间,因为这些功能将需要它们自己的独立DEP和研究才能完全异步。

Django 3.0开始了为Django带来完全异步功能的旅程,首先是增加了对可以运行同步代码的ASGI的支持。在这个版本中,如果您不需要对Django的某些还不支持异步的部分进行繁重的操作,那么您实际上可以将异步代码投入生产。事实上,所有更改都保证100%向后兼容,这本身就是一个令人印象深刻的壮举-而且它很快就保证了Django中完全异步支持的光明未来!

DeepSource帮助您在代码检查期间自动查找并修复代码中的问题,例如错误风险、反模式、性能问题和安全缺陷。使用您的Bitbucket、GitHub或GitLab帐户设置只需不到5分钟。它适用于Python、Go、Ruby和JavaScript。

免费开始