一、上下文管理相关知识点:
a、类似于本地线程 创建Local类: { 线程或协程唯一标识: { ‘stack‘:[request],‘xxx‘:[session,] }, 线程或协程唯一标识: { ‘stack‘:[] }, 线程或协程唯一标识: { ‘stack‘:[] }, 线程或协程唯一标识: { ‘stack‘:[] }, } b、上下文管理的本质 每一个线程都会创建一个上面那样的结构, 当请求进来之后,将请求相关数据添加到列表里面[request,],以后如果使用时,就去读取 列表中的数据,请求完成之后,将request从列表中移除 c、关系 local = 小华={ 线程或协程唯一标识: { ‘stack‘:[] }, 线程或协程唯一标识: { ‘stack‘:[] }, 线程或协程唯一标识: { ‘stack‘:[] }, 线程或协程唯一标识: { ‘stack‘:[] }, } stack = 强哥 = { push pop top } 存取东西时都要基于强哥来做 d、最近看过一些flask源码,flask还是django有些区别 - Flask和Django区别? - 请求相关数据传递的方式 - django:是通过传request参数实现的 - Flask:基于local对象和,localstark对象来完成的 当请求刚进来的时候就给放进来了,完了top取值就行了,取完之后pop走就行了 问题:多个请求过来会不会混淆 -答: 不会,因为,不仅是线程的,还是协程,每一个协程都是有唯一标识的: from greenlent import getcurrentt as get_ident #这个就是来获取唯一标识的
二、上下文管理流程:
-上下文管理: - 请求上下文(ctx=RequestContext()):request/session - App上下文(app_ctx=AppContext()): app/g - 程序启动: 两个Local: local1 = { } local2 = { } 两个LocalStack: _request_ctx_stack _app_ctx_stack - 请求到来 对数据进行封装: ctx = RequestContext(request,session) app_ctx = AppContext(app,g) 保存数据: 将包含了(app,g)数据的app_ctx对象,利用 _app_ctx_stack(贝贝,LocalStack())将app_ctx添加到Local中 storage = { 1231:{stack:[app_ctx(app,g),]} } 将包含了request,session数据的ctx对象,利用_request_ctx_stack(刘淞,LocalStack()),将ctx添加到Local中 storage = { 1231:{stack:[ctx(request,session),]} } - 视图函数处理: from flask import Flask,request,session,current_app,g app = Flask(__name__) @app.route(‘/index‘) def index(): # 去请求上下文中获取值 _request_ctx_stack request.method # 找小东北获取值 session[‘xxx‘] # 找龙泰获取值 # 去app上下文中获取值:_app_ctx_stack print(current_app) print(g) return "Index" if __name__ == ‘__main__‘: app.run() app.wsgi_app - 结束 _app_ctx_stack.pop() _request_ctx_stack.pop()
三、上下文管理源码剖析
详见:https://www.cnblogs.com/jiangshanduojiao/p/9200902.html
原文地址:https://www.cnblogs.com/jiangshanduojiao/p/9200897.html
时间: 2024-11-09 06:28:40