返回顶部
首页 > 资讯 > 精选 >Flask的上下文管理详解
  • 508
分享到

Flask的上下文管理详解

2023-06-02 01:06:53 508人浏览 泡泡鱼
摘要

本篇内容介绍了“flask的上下文管理详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flask线程间上下文安全Falsk完成线程安全的原

本篇内容介绍了“flask的上下文管理详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Flask线程间上下文安全

Falsk完成线程安全的原理,是在启动之后进程里维护request栈和app栈,栈是通过线程ID来保证每个请求的线程安全。

实现主要依赖三个类Local,LocalStack和LocalProxy,下面看一下具体的实现原理

三个类构建本地数据

Local

先看Local的源码,实质并不是Flask中定义的,而是Flask依赖的werkzeug库所定义。

可以看到其定义的两个属性__storage__, __ident_func__以及三个方法__getattr__,__setattr__,__release_local__。

属性__storage__是多层级字典,第一层key是隐含的线程ID或者协程ID,第二层的key是实际使用的关键字

属性__ident_func__可以看到是get_ident函数,get_ident函数要么是通过thread库获取当前执行单元的线程ID,要么是通过greenlet库获取当前执行协程的协程ID。

另外可以看到Local这个类的三个方法,实质是通过重写python内置函数__setattr__和__getattr__来实现线程或者协程间数据隔离

获取local某属性时如:local.age实质触发的是__getattr__方法先获取到当前线程ID——__ident_func__函数获取,然后在__storage__字典中找到线程ident对应的结果集从获取到的结果中再查找age属性

设置local某属性时如:local.age = 12 实际触发的是__setattr__方法先获取到当前线程ID——__ident_func__函数获取,然后在__storage__字典设置相应的属性字典集

另一个__release_local__方法就是将相应的线程数据删除。

画个简图比较起来更直观一些。

Flask的上下文管理详解

主线程中生成一个对象local=Local(),三个线程中进行相同的操作local.no=每个线程对应的数。为每个线程都开辟一个存储,所以谁来取或者存就找到自己对应中的位置,虽然取得key都一样,但是每次存取都是只关于自己的值。

LocalStack

LocalStack也是定义在Flask所依赖的werkzeug库,从字面意思来理解,它就是Local的堆栈操作,看一下源码如何定义。

LocalStack实质就是围绕着Local来进行操作,根据上面我们读完Local的源码可以看到,

  1. LocalStack定义了一个Local对象

  2. 给这个对象设置了一个stack属性,且这个属性是一个列表

  3. LocalStack中定义了对这个列表进行压栈,出栈等方法

  4. 给类中的Local对象提供了自定义ident_func的方法

LocalProxy

LocalProxy字面意思就是做一个Local的代理,我们先从一个request的定义来看LocalProxy的用法,然后结合源码来看LocalProxy到底是用来做什么?

类中稍微有些难理解的就是关于object.__setattr__(self, “_LocalProxy__local”, local)的作用,实际就是给self设置一个__local属性。这是Python类中关于私有变量的定义。可以看Python的官方定义python私有变量。

可以看到这个类将所有Python类所内置的方法都进行重写,重写后所有的操作都是基于类中所定义的_get_current_object方法返回的对象进行操作。

而这个方法中返回值就是初始化时所给定的local对象执行返回的结果。如果创建时指定的不是Local对象,则直接执行此方法。如果给定的是Local对象,则根据类名查找对应的对象。

现在这个比较抽象,这个代理到底是做的什么? 我们结合Flask定义全局的request对象来看。假如我们想获取请求的方法是什么,那我们使用的就是request.method。

下面是request定义的源码

  1. 根据LocalProxy的源码中重写的__getattr__方法,先执行_get_current_object方法获取到对象,然后再获取返回对象method属性。

  2. 创建LocalProxy时传递的函数是_lookup_req_object的偏函数,实际就是_lookup_req_object且name=request

  3. 再LocalProxy中__local就是一个函数,所以在执行_get_current_object就是执行_lookup_req_object且name=request返回的值,然后再取其method属性

  4. 此时再执行_lookup_req_object函数,从_request_ctx_stack获取top的request

使用Proxy可以简单快捷的使用request.method获取相应的值,其核心就是每次获取时都会执行对应的函数,而函数中每次返回的值都是线程安全。保证数据正确且优雅。 否则我们每次都去执行一个函数来获取其值,然后再取其属性。

“Flask的上下文管理详解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Flask的上下文管理详解

本文链接: https://lsjlt.com/news/228488.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flask的上下文管理详解
    本篇内容介绍了“Flask的上下文管理详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flask线程间上下文安全Falsk完成线程安全的原...
    99+
    2023-06-02
  • 详解Python中的上下文管理器原理
    目录with语句上下文管理器原理自定义上下文管理器contextmanager 装饰器with语句 在我们日常使用场景中,经常会操作一些资源,比如文件对象、数据库连接、Socket连...
    99+
    2023-03-11
    Python上下文管理器原理 Python上下文管理器使用 Python上下文管理器
  • Flask中的请求上下文和应用上下文对象如何理解
    这篇文章将为大家详细讲解有关Flask中的请求上下文和应用上下文对象如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Flask中处理请求时,应用会生成一个“请求上下文”对象。整个请求...
    99+
    2023-06-17
  • 关于Flask上下文详细介绍
    目录1、上下文概念2、Flask中的上下文2.1请求上下文2.2应用上下文 1、上下文概念 上下文,说白了就是所谓的语境,就是语言环境。比如单独拎出来一篇文章的某一句话,我们可能不能...
    99+
    2024-04-02
  • 详解Python中contextlib上下文管理模块的用法
    咱们用的os模块,读取文件的时候,其实他是含有__enter__ __exit__ 。 一个是with触发的时候,一个是退出的时候。 with file('nima,'r') as f: prin...
    99+
    2022-06-04
    上下文 详解 管理模块
  • 详解Python中的with语句和上下文管理器
    目录一、with语句的使用二、上下文管理器三、小结如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 with 关键字的语句,它通常用在什么场景呢?对于系统资源如文件、数据...
    99+
    2024-04-02
  • chatGPT之Python API启用上下文管理案例详解
    chatGPT已经爆火一段时间了,我想大多数的开发者都在默默的在开发和测试当中,可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。 为什么别人的机器人能联想之...
    99+
    2023-03-19
    Python API启用上下文管理 chatGPT Python API
  • Flask上下文举例分析
    本篇内容介绍了“Flask上下文举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、上下文概念上下文,说白了就是所谓的语境,就是语言环...
    99+
    2023-06-21
  • Python上下文管理器深入讲解
    目录引子概念上下文管理协议(Context Management Protocol)上下文管理器(Context Manager)引子 上下文管理器是一种简化代码的有力方式,其内部也...
    99+
    2022-12-21
    Python上下文管理器 Python上下文
  • 深人了解Python上下文管理器
    目录with语句上下文管理器创建基于类的上下文管理器@contextmanager 装饰器总结下面先来介绍一下with关键字在文件读写中的应用,简单了解上下文管理器的功能。 with...
    99+
    2024-04-02
  • 详解利用上下文管理器扩展Python计时器
    目录一个 Python 定时器上下文管理器了解 Python 中的上下文管理器理解并使用 contextlib创建 Python 计时器上下文管理器使用 Python 定时器上下文管...
    99+
    2024-04-02
  • Python基础之with语句和上下文管理器详解
    目录1. with语句的使用2. 上下文管理器3. 上下文管理器的另外一种实现方式1. with语句的使用 基础班向文件中写入数据的示例代码: # 1、以写的方式打开文件 f =...
    99+
    2023-05-18
    Python with语句 Python with Python 上下文管理器
  • 深入解析Python中的上下文管理器
    1. 上下文管理器是什么? 举个例子,你在写Python代码的时候经常将一系列操作放在一个语句块中: (1)当某条件为真 执行这个语句块 (2)当某条件为真 循环执行这个语句块 有时候我们需要在当程序在...
    99+
    2022-06-04
    上下文 管理器 Python
  • Python上下文管理器详细使用教程
    目录上下文管理器和with块contextlib模块@contextmanager 装饰器@contextmanager 原理和注意事项with语句会设置一个临时的上下文,交给上下文...
    99+
    2023-02-08
    Python上下文管理器 Python上下文
  • Python编程ContextManager上下文管理器讲解
    目录什么是上下文管理器官方解释简单一句话__enter__(self)__exit__(self, exc_type, exc_value, exc_traceback)有哪些常见上...
    99+
    2024-04-02
  • Python上下文管理器Content Manager
    在 Python 中,我们会经常听到上下文管理器(Context Manager),那我们探讨下这是什么,又有什么功能。 在 Python 中的上下文管理器中,使用 with 打开文件是使用最多的,其中离开 wit...
    99+
    2022-06-02
    Python上下文管理器 Python Content Manager
  • 什么是上下文管理器
    一、上下文管理器 上下文管理器(Context Manager)是Python中的一种编程模式,用于管理资源的获取和释放。它通过定义一个特定的上下文环境,确保在进入和离开这个环境时,相关资源会被正确地获取和释放。 二、实现方式 在Pytho...
    99+
    2023-10-29
    上下文 管理器
  • Flask请求钩子与上下文及异常处理分项精解
    目录一、请求钩子学习介绍二、上下文1.介绍2.请求上下文3.应用上下文4.G对象三、异常处理1.HTTP异常主动抛出2.捕获错误一、请求钩子学习 介绍 1.为了让每个视图函数避免编写...
    99+
    2024-04-02
  • Python Flask实现图片上传与下载的示例详解
    目录1、效果预览2、新增逻辑概览3、tuchuang.py 逻辑介绍3.1 图片上传3.2 图片合法检查3.3 图片下载4、__init__.py 逻辑介绍5、upload.html...
    99+
    2024-04-02
  • python上下文管理器怎么解决异常
    这篇文章给大家分享的是有关python上下文管理器怎么解决异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作