彩神大发排列五_神彩大发排列五官方 - 彩神大发排列五,神彩大发排列五官方是新浪网最重要的频道之一,24小时滚动报道国内、国际及社会新闻。每日编发新闻数以万计。

Flask的上下文管理

  • 时间:
  • 浏览:1

使用app = Flask(__name__),完会 实例化日后Flask应用。实例化的Flask应用有这个要点或形态都要注意一下:

这里的实现用到了日后东西:LocalStack 和 LocalProxy。它们日后的结果统统我亲戚亲戚大家完会 动态地获取日后上下文的内容,在并发系统线程中每个视图函数完会 看后属于本人的上下文,而不要再再次再次出现混乱。

亲戚亲戚大家在日后看后了 request context 的定义,它统统我日后 LocalStack 的实例:

中间亲戚亲戚大家分析到当Flask应用被调用完会 执行wsgi_app(environ, start_response)最好的最好的最好的办法。完会 看出,wsgi_app是真正被调用的WSGI应用,不言而喻日后设计,统统我为了在应用正式正确处理请求日后,wsgi_app完会 被这个“中间件”装饰,以便先行正确处理这个操作。

理解了 Local,亲戚亲戚大家继续回来看另外日后类。

最直观地做法是把那些信息封装成日后对象,作为参数传递给视图函数。统统我日后励志的话 ,所有的视图函数都都要换成对应的参数,即使该函数内部内部结构并没人 使用到它。

flask 涵盖有一种上下文:application context 和 request context。上下文有关的内容定义在 globals.py 文件。

这里实现的关键是把通过参数传递进来的 Local 实例保处在 __local 属性中,并定义了 _get_current_object() 最好的最好的最好的办法获取当前系统线程统统我协程对应的对象。

完会 看后,Local 对象内部内部结构的数据都要保处在 _storage_ 属性的,这个 属性变量是个嵌套的字典:{"ident":{"key1":"value1","key2":"value2",...}}。最外面字典 key 是系统线程统统我协程的 identity,value 是另外日后字典,这个 内部内部结构字典统统我用户自定义的 key-value 键值对。

Flask应用的run()最好的最好的最好的办法会调用werkzeug.serving模块中的run_simple最好的最好的最好的办法。这个 最好的最好的最好的办法会创建日后本地的测试服务器,统统我在这个 服务器中运行Flask应用。

flask 提供有一种上下文:application context 和 request context 。application context 又演化出来日后变量 current_app 和 g,而 request context 则演化出来 request 和 session。

LocalStack 和 LocalProxy 都要 werkzeug 提供的,定义在 local.py 文件中。在分析这日后类日后,亲戚亲戚大家先介绍这个 文件另外日后基础的类 Local。Local 统统我实现了例如 threading.local 的效果——多系统线程统统我多协程情況下全局变量的隔离效果。下面是它的代码:

在 flask 中,视图函数都要知道它执行情況的请求信息(请求的 url,参数,最好的最好的最好的办法等)以及应用信息(应用中初始化的数据库等),才不能正确运行。

输出结果.png

没人 怎么后能 实现这个 效果呢?统统我对 python 多系统线程比较熟悉励志的话 ,应该知道多系统线程涵盖个非常例如的概念 threading.local,完会 实现多系统线程访问某个变量的日后只看后本人的数据。内部内部结构的原理说起来也很简单,这个 对象有日后字典,保存了系统线程 id 对应的数据,读取该对象的日后,它动态地查询当前系统线程 id 对应的数据。

到这里,上下文的实现就比较清晰了:每次有请求过来的日后,flask 会先创建当前系统线程统统我系统线程都要正确处理的日后重要上下文对象,把它们保存到隔离的栈中间,日后视图函数进行正确处理的日后就能直接从栈上获取那些信息。

push 操作统统我把该请求的 ApplicationContext(统统我 _app_ctx_stack 栈顶都要当前请求所在 app ,都要创建新的 app context) 和 RequestContext 有关的信息保存到对应的栈上,压栈后完会 保存 session 的信息; pop 则相反,把 request context 和 application context 出栈,做这个清理性的工作。

用户访问实例的属性,就变成了访问内部内部结构的字典,外面字典的 key 是自动关联的。self._ident_func_() 统统我执行get_ident(),得到的是协程的 get_current 统统我系统线程的 get_ident,从而获取当前代码所在系统线程统统我协程的 id。

_release_local_ 完会 用来清空当前系统线程统统我协程的栈数据,_call_ 最好的最好的最好的办法返回当前系统线程统统我协程栈顶元素的代理对象。

每次在调用 app._call_ 的日后,完会 把对应的请求信息压栈,最后执行完请求的正确处理日后把它出栈。

庭院深深深几许,杨柳堆烟,帘幕无重数。玉勒雕鞍游冶处,楼高不见章台路。

雨横风狂三月暮,门掩黄昏,无计留春住。泪眼问花花不语,乱红飞过秋千去。

它调用了 RequestContext,并把 self 和请求信息的字典 environ 当做参数传递进去。追踪到 RequestContext 定义的地方,它再次再次出现在 ctx.py 文件中,代码如下:

输出结果.png

当服务器刚开始英文英文了了调用Flask应用后,便会触发Flask应用的_call_(environ, start_response)最好的最好的最好的办法。其中environ由服务器产生,start_response在服务器中定义。

它会把当前系统线程统统我协程的请求都保处在栈里,等使用的日后再从中间读取。

看下面这段代码就能看明白,统统我_request_ctx_stack 是多系统线程统统我协程隔离的栈形态,request 每次完会 调用 _lookup_req_object 栈头部的数据来获取保处在中间的 requst context。

亲戚亲戚大家来看看request_context, 这个 最好的最好的最好的办法只有一行代码:

LocalProxy 是日后 Local 对象的代理,负责把所有对本人的操作转发给内部内部结构的 Local 对象。LocalProxy 的构造函数介绍日后 callable 的参数,这个 callable 调用日后都要返回日后 Local 实例,后续所有的属性操作完会 转发给 callable 返回的对象。

没人 请求上下文信息是那些日后被中放 stack 中呢?还记得日后介绍的 wsgi_app() 最好的最好的最好的办法有下面代码吗?

除了那些基本操作之外,Local 还实现了_release_local_ ,用来清空(析构)当前系统线程统统我协程的数据(情況)。_call_ 操作来创建日后 LocalProxy 对象,LocalProxy 会在下面讲到。

LocalStack 是基于 Local 实现的栈形态。统统我说 Local 提供了多系统线程统统我多协程隔离的属性访问,没人 LocalStack 就提供了隔离的栈访问。下面是它的实现代码,完会 看后它提供了 push、pop 和 top 最好的最好的最好的办法。

中间累积分析了实例化的Flask应用长那些样子。当日后完整版的Flask应用实例化后,完会 通过调用app.run()最好的最好的最好的办法运行这个 应用。

flask 的做法是把那些信息作为例如全局变量的东西,视图函数都要的日后,完会 使用 from flask import request 获取。统统我那些对象和全局变量不同的是——它们都很久动态的,统统我在多系统线程统统我多协程的情況下,每个系统线程统统我协程获取的都要本人独特的对象,不要再互相干扰。

每个 request context 都保存了当前请求的信息,比如 request 对象和 app 对象。在初始化的最后,还调用了 match_request 实现了路由的匹配逻辑。