flask 的上下文管理
Flask的上下文对象
Flask有两种
Context
(上下文),分别是RequestContext
请求上下文Request
请求的对象,封装了Http请求(environ
)的内容Session
根据请求中的cookie,重新载入该访问者相关的会话信息。AppContext
程序上下文g
处理请求时用作临时存储的对象。每次请求都会重设这个变量current_app
当前激活程序的程序实例
生命周期:
current_app
的生命周期最长,只要当前程序实例还在运行,都不会失效。Request
和g
的生命周期为一次请求期间,当请求处理完成后,生命周期也就完结了Session
就是传统意义上的session了。只要它还未失效(用户未关闭浏览器、没有超过设定的失效时间),那么不同的请求会共用同样的session。
wsgi
environ
: 一个包含全部HTTP请求信息的字典,由WSGI Server
解包HTTP请求生成。start_response
: 一个WSGI Server
提供的函数,调用可以发送响应的状态码和HTTP
报文头, 函数在返回前必须调用一次start_response()
。application()
应当返回一个可以迭代的对象(HTTP正文)。application()
函数由WSGI Server
直接调用和提供参数。- Python内置了一个
WSGIREF
的WSGI Server
,不过性能不是很好,一般只用在开发环境。可以选择其他的如Gunicorn
。
flask的上下文管理分为应用(app)上下文管理,和请求(request)上下文管理,
Flask源码流程
第一部分:请求到来时
第二部分:视图函数
第三部分:请求结束前
第一部分 : 请求到来时,首先执行app.run() 执行里面的__call__()方法
def __call__(self, environ, start_response):
"""The WSGI server calls the Flask application object as the
WSGI application. This calls :meth:`wsgi_app` which can be
wrapped to applying middleware."""
return self.wsgi_app(environ, start_response)
然后执行wsgi_app()把environ 和 start_response传进去,执行这句ctx = self.request_context(environ) 返回一个RequestContext对象,environ是请求封装的所有信息,一个字符串对象 RequestContext对象初始化时执行 request = app.request_class(environ) request_class中执行request_class = Request 所有的请求信息都是在Reques类中封装的,得到的ctx对象中有两个属性,ctx.request 和 ctx.session
ctx = self.request_context(environ) --> return RequestContext(self, environ)
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ) # ctx.request 和 ctx.session
error = None
try:
try:
ctx.push()
response = self.full_dispatch_request() # 执行函数 分发
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
接下来第二部分 执行函数
response = self.full_dispatch_request() 这个函数里判断是否有before_request方法 有就先执行before_request方法,没有继续执行函数
第一步:创建上下文
Flask根据WSGI Server封装的请求等的信息(environ
)新建RequestContext对象
和AppContext对象
# context locals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, 'request')) # 偏函数 得到ctx.request
session = LocalProxy(partial(_lookup_req_object, 'session')) # 偏函数 得到ctx.session
g = LocalProxy(partial(_lookup_app_object, 'g'))
flask 的上下文管理的更多相关文章
- Flask的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- python框架之Flask(4)-上下文管理
知识储备 偏函数 作用 偏函数,帮助开发者自动传递参数. 使用 import functools def index(a1, a2): return a1 + a2 # 原来的调用方式 # ret = ...
- flask框架----上下文管理
一.上下文管理相关知识点: a.类似于本地线程 创建Local类: { 线程或协程唯一标识: { 'stack':[request],'xxx':[session,] }, 线程或协程唯一标识: { ...
- Flask 之 上下文管理
Flask上下文管理 分类: 请求上下文管理 应用上下文管理 请求上下文管理 request a. 温大爷:wsig b. 赵毅: ctx = ReuqestContext(session,reque ...
- Flask的上下文管理
flask上下文管理 1.运用的知识点 val = threading.local() def task(arg): #threading.local() val.xxx=123 #内部,获取当前线程 ...
- Flask:上下文管理
1. werkzurg from werkzur.serving import run_simple def run(environ,start_response): reuturn [b'hello ...
- Flask上下文管理、session原理和全局g对象
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- flask你一定要知道的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask上下文管理
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
随机推荐
- docker 启动redis容器
dockerfile FROM registry.cn-hangzhou.aliyuncs.com/xxxholic/redis COPY redis.conf EXPOSE redis.conf p ...
- 第01章 开发准备(对最新版的RN进行了升级)1-2+项目技术分解
- elasticsearch2.x插件之一:kopf
kopf kopf is a simple web administration tool for elasticsearch written in JavaScript + AngularJS + ...
- 9-python 的ProxyHandler处理器(代理设置)
ProxyHandler处理器(代理设置) 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的. 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正 ...
- github如何上传代码
别人写的太好了,没必要重写.备份给自己参看. 1.https://www.cnblogs.com/zlxbky/p/7727895.html 2.https://blog.csdn.net/pql92 ...
- 符合mvc思维的分页思想
.Model Student.cs namespace WebApplication14.Models { public class Student { public int Id { get; se ...
- Asp.net MVC获取访问系统的客户端计算机的主机名和IP地址
string HostName = string.Empty; string ip = string.Empty; string ipv4 = String.Empty; if (!string.Is ...
- 编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型
建议32:总是优先考虑泛型 泛型的优点是多方面的,无论泛型类还是泛型方法都同时具备可重用性.类型安全性和高效率等特性,这是非泛型和非泛型方法无法具备的. 以可重用性为例: class MyList { ...
- 设计模式07: Bridge 桥接模式(结构型模式)
Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? ...
- python2.7响应数据中unicode转中文
print ("响应结果:%s" % r.content.decode('unicode_escape')) 一. 在爬虫抓取网页信息时常需要将类似"\u4eba\u75 ...