创新互联Django4.0教程:Django4.0中间件-异步支持

中间件支持同步和异步请求的任意组合。如果Django不能同时支持它们,它会调整请求来适应中间件的需求,但会有性能损失。

成都网站建设、网站设计介绍好的网站是理念、设计和技术的结合。创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。

默认情况下,Django假设你的中间件只能处理同步请求。如果要改变这种模式,需要在你的中间件工厂函数或类中添加入如下属性:

  • sync_capable ​是一个布尔值,来表明中间件是否处理同步请求。默认为 ​True​。
  • async_capable ​是一个布尔值,来表明中间件是否处理异步请求。默认为 ​False​。

如果中间件的​sync_capable = True​并且 ​async_capable = True​,那么Django 会将请求传递给它而不进行转换。在这种情况下,你可以使用 ​asyncio.iscoroutinefunction()​ 来检查传递的 ​get_response​ 是否是一个协同函数,从而确定中间件是否接收到异步请求。
django.utils.decorators​ 模块包含 ​sync_only_middleware()​,​async_only_middleware()​ 和 ​sync_and_async_middleware()​ 装饰器,允许你将这些标志应用到中间件工厂函数中。
返回的可调用对象必须符合 ​get_response ​方法的同步或异步性质。如果你有一个异步的 ​get_response​,你必须返回一个协程函数(​async def​)。
process_view​、​process_template_response ​和 ​process_exception ​方法,如果有的话,也应该进行调整以匹配同步/异步模式。然而,如果你不这样做,Django 会根据需要单独调整它们,但会有额外的性能损失。
下面以一个例子来说明如何创建一个支持这两种功能的中间件函数:

import asyncio
from django.utils.decorators import sync_and_async_middleware

@sync_and_async_middleware
def simple_middleware(get_response):
    # One-time configuration and initialization goes here.
    if asyncio.iscoroutinefunction(get_response):
        async def middleware(request):
            # Do something here!
            response = await get_response(request)
            return response

    else:
        def middleware(request):
            # Do something here!
            response = get_response(request)
            return response

    return middleware

注解:如果你声明了一个同时支持同步和异步调用的混合中间件,你得到的调用种类可能与底层视图不匹配。Django 会优化中间件调用栈,使其尽可能少的同步/异步转换。

因此,即使你包装的是一个异步视图,如果在你和视图之间有其他的、同步的中间件,你也可能会在同步模式下被调用。

新闻标题:创新互联Django4.0教程:Django4.0中间件-异步支持
文章链接:http://www.gawzjz.com/qtweb/news15/164265.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联