永州网,内容丰富有趣,生活中的好帮手!
永州网 > 随笔 > 正文

深入探讨:web框架中的上下文机制实现与作用

时间:2024-03-03

相关推荐

面试官问及web框架中的上下文机制时,通常指的是在处理请求过程中的上下文环境管理。这一机制通过线程局部变量或者其他方式,将请求的相关信息(如请求头、请求参数等)保存在上下文中,使得在整个请求处理过程中能方便地访问这些信息。上下文机制的作用在于简化开发人员编写代码的复杂度,提高代码的可维护性和可读性。另外,它也为实现请求级别的状态管理提供了便利,同时能够支持并发请求的隔离,确保请求处理的线程安全性。总之,上下文机制为web框架提供了一种有效的方式来管理请求的相关信息,为开发人员提供了便捷的编程接口。

本文基于python的Flask框架,分享其上下文机制的实现和原理。在Flask中,上下文机制是最核心的概念之一。不仅仅是因为通过上下文机制实现了客户端和服务器交互简单化的目的,更为了flask的生态发展,可插拔式的组件开发提供了很好的支持。

You Deserve A Better Life

01

什么是Flask中的上下文?

从生活中理解Flask的上下文

假设说你要去取快递(发送请求),你来到了快递站点,然后你需要告诉工作人员你的快递单号,你的电话号码等个人信息,工作人员才会在系统中(系统中的信息可以理解为已经创建好的上下文代理,只有当你的信息需要被需要时,才会动态生成你的信息)查找,会根据你的提货码将快递取出给你(根据你提供的上下文信息给出响应),并在系统中修改为此快递已被取走(删除此次的上下文信息)

专业化的解释

上下文其实就是你向服务器发送请求时所需要的资料(包括请求参数,配置,验证等等),需要的时候取资料,用完则释放

02

flask中的上下文变量有哪些

flask中的上下文变量一共有4个,分为两类,分别是请求上下文和应用上下文

请求上下文:request和session

request:客户端的请求参数session:作为用户唯一标志,一般用来做用户登录状态的记录等程序上下文:current_app和g

current_app:指向当前应用实例g:一次请求中的全局变量,负责加载当前请求的一些操作,比如说连接数据库,响应结束,连接关闭

03

源码解读

先来看看上下文变量在哪里,怎么写的

我们知道Proxy是代理的意思,那么也就是说,这几个上下文变量其实都是通过代理类实现的,我们研究下这个代理类

代理类

实例方法中,object.__setattr__(self, "_LocalProxy__local", local)这个写法可能有人不太理解,其实等价于self.__local = local

其实就是类的私有变量(双下划线属性)进行外部调用的写法

这个local是必须要传进来的变量,是一个偏函数,那么啥叫偏函数?

偏函数

通过上述我们知道偏函数其实就是调用原有函数,只不过可以添加需要传递的参数,这样在后面调用偏函数时就可以少传递几个变量,那么我们看下上下文变量的偏函数都干了什么(用request举例)

总结来说:上下文变量request就是通过代理类拿到了请求上下文的RequestContext中的request属性,这个request属性拥有客户端请求的所有参数。

既然属性已经拿到了,就可以使用request.method,request.args等方式进行调用客户端参数,这个调用的原理又是什么呢?

既然是request对象进行调用,而request又是LocalProxy的代理类的对象,我们知道,"对象点方法"的使用,是去类中寻找__getattr__方法,那么我们看下这个方法

LocalProxy.__getattr__方法

这个方法基于反射原理,实现了动态取request对象中存在的方法,看下源码

通过上述的过程,request对象成功的找到了method方法。同理,但凡是需要使用的客户端的请求参数,就是在这里根据不同的name进行反射提取

其他几个上下文变量实现的方法大同小异,都是通过代理类(除了current_app),偏函数,反射实现,这里就不作一一的解释了。

04

应用上下文作用和意义

官方文档

应用上下问存在的主要原因是,在过去,请求上下文被附加了一堆函数,但是又没有什么好的解决方案。因为 Flask 设计的支柱之一是你可以在一个 Python 进程中拥有多个应用。

那么代码如何找到“正确的”应用?在过去,我们推荐显式地到处传递应用,但是这会让我们在使用不是以这种理念设计的库时遇到问题。

解决上述问题的常用方法是使用后面将会提到的current_app代理对象,它被绑定到当前请求的应用的引用。既然无论如何在没有请求时创建一个这样的请求上下文是一个没有必要的昂贵操作,应用上下文就被引入了。

我的理解

这样设计的优势在于上下文的推送和删除是动态进行的,如果需要使用,则动态的加载,不需要使用,则放在内存中不用管。

收集不易,本文《深入探讨:web框架中的上下文机制实现与作用》知识如果对你有帮助,请点赞收藏并留下你的评论。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
显示评论内容(3)
  1. 陌上紫藤2024-03-03 17:08陌上紫藤[辽宁省网友]203.28.88.142
    作为一个刚入门的前端开发者,对于上下文机制的作用还不是很清楚,希望能有更多的资源可以参考学习。
    顶10踩0
  2. 為你努力2024-03-03 16:56為你努力[海南省网友]116.90.188.246
    上下文机制在web框架中应该扮演着很重要的角色,想知道它具体是怎么实现的。
    顶3踩0
  3. 斑布竹2024-03-03 16:44斑布竹[甘肃省网友]203.6.136.112
    这个话题真的好有深度,我一直对web框架的上下文机制很好奇,期待深入了解。
    顶5踩0
相关阅读
职场揭秘:揭秘HR的套路 你真的知道吗?

职场揭秘:揭秘HR的套路 你真的知道吗?

书中通过揭示HR部门常用的招聘、培训、绩效考核等方面的套路和技巧,帮助读者了解人力资源管理的底层运作机制

2024-02-13 #百科

攻略:英语面试技巧大揭秘

攻略:英语面试技巧大揭秘

本文将通过提供实用的技巧和建议,帮助读者有效应对英语面试中的挑战

2024-02-19 #生活

英国留学面试:通关秘籍大揭秘!

英国留学面试:通关秘籍大揭秘!

本文旨在分享英国留学面试的准备技巧和通关秘籍,帮助广大留学生在面试过程中游刃有余

2024-02-27 #推荐

解密面试官的回去等通知:如何理解和应对?

解密面试官的回去等通知:如何理解和应对?

这句话本质上是面试官对你当前状态的一种警告,意味着你目前处于待定状态,需要等待进一步的决定

2024-03-01 #生活

应对重大突发公共事件 慈善组织如何更有作为?

应对重大突发公共事件 慈善组织如何更有作为?

应对重大突发公共事件+慈善组织如何更有作为?这个题目涉及到两个重要议题:一是面对突发公共事件,社会应如何应对,提高应对风险的能力和效率,减少损失;二是慈善组织在应对重大...

2024-03-03 #知识