建网站怎么样才能流畅,asp做网站,爱站网关键词长尾挖掘,wordpress地址为灰色每篇前言#xff1a; #x1f3c6;#x1f3c6;作者介绍#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 #x1f525;#x1f525;本文已收录于Flask框架从入门到实战专栏#xff1a;《Flask框架从入…每篇前言 作者介绍【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 本文已收录于Flask框架从入门到实战专栏《Flask框架从入门到实战》热门专栏推荐《Python全栈系列教程》、《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《前端系列教程》、《tornado一条龙一个完整版项目》。本专栏面向广大程序猿为的是大家都做到Flask从入门到精通穿插有很多实战优化点。订阅专栏后可私聊进一千多人Python全栈交流群手把手教学问题解答 进群可领取Python全栈教程视频 多得数不过来的计算机书籍基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。加入我一起学习进步一个人可以走的很快一群人才能走的更远 经过上文分析我们可以将整个过程分为三阶段 将ctx对象包含request和session放到Local对象中 视图函数导入request/session; 请求处理完毕 获取session并加密后保存到cookie将ctx删掉
第一阶段 将ctx对象包含request和session放到Local对象中。 进去下图中self就是ctx对象 继续进 显而易见上述_request_ctx_stack是一个全局变量在整个应用程序的生命周期中它只创建一次这是一种单例模式的实现方式~
继续进 可以看到这个对象里又包了一个对象这个_local对象才是真正存ctx的而上面的_request_ctx_stack对象则相当于是一个代理每次需要存ctx的时候都要先交给代理代理再将其给到真正存储ctx的_local对象里
上述push方法中_local对象点stack又会触发Local对象的__setattr__方法 下图以第一阶段为主画了个简单的流程图以便大家更好地梳理
拓展一flask里的session 是什么时候创建什么时候销毁的
当请求刚进来的时候会将request和session封装成一个request_context对象接下来通过LocalStack把这个对象放到内部的Local里【注意现在session还是空的】
下一步执行open_session将cookie里的值拿来处理后再放到Local中的ctx里。
最后返回的时候要执行save_session将ctx里的session读出来序列化后存到用户cookie中再将ctx给pop掉~
第二阶段
分析下图的流程 from flask import Flask, requestapp Flask(__name__)app.route(/)
def hello_world():print(request) # 执行request对象的__str__方法request.method # 执行request对象的__getattr__(keymethod)方法return hello world~if __name__ __main__:app.__call__app.run()
看源码进request 回去
from flask import Flask, requestapp Flask(__name__)app.route(/)
def hello_world():print(request) # LocalProxy对象的__str__ request.method # LocalProxy对象的__getattr__(keymethod) 这一步应该包含多个操作先去ctx中拿到request再去request中获取methodreturn hello world~if __name__ __main__:app.__call__app.run()
进LocalProxy源码 进去_get_current_object() __local就是最开始传给LocalProxy的经过偏函数处理的那个函数下图中的这个 __local函数加括号执行这个函数进去看 继续看session 如上图所指会执行session对象的__setitem__方法~
进session源码
和request区别就是传的参数是session 跳出来 from flask import Flask, request, sessionapp Flask(__name__)app.route(/)
def hello_world():print(request) # LocalProxy对象的__str__request.method # LocalProxy对象的__getattr__ 这一步应该包含多个操作先去ctx中拿到request再去request中获取methodsession[k1] guhanzhe # LocalProxy对象的__setitem__(keyk1, valueguhanzhe) # 先去ctx中拿到session再给session中设置对应的值session[k1] # LocalProxy对象的__getitem__(key1) # 先去ctx中拿到session再去session中获取对应的值return hello world~if __name__ __main__:app.__call__app.run()
视图函数中有关于request和session的操作都是通过LocalProxy对象这个中介操作然后再通过函数_lookup_req_object去ctx获取到request和session对象。 第三阶段
pop肯定也不是直接pop的也要走中介如下图蓝色流程线 但是上述所画几个流程图其实都不全所以再来缕一遍源码
进push
在这个AppContext对象中又封装了两个值app和g 回退 封装了那两个值后执行app_ctx.push()再来看看app_ctx是啥
所以流程图又要更新了这次多了个存放app就是程序进来实例化的Flask对象和g的对象
完整画图 上面刚说多了个g和app
进去g 进去current_app
是不是和request和session一个流程
最后来看看最后的最后 把最后的最后补充进图 上面这个机制支持多线程
Flask中一共有几个LocalStack和Local对象
都是两个~