zoukankan      html  css  js  c++  java
  • Flask 之 上下文管理

    Flask上下文管理

    分类:

    请求上下文管理

    应用上下文管理

    请求上下文管理

    request

    a. 温大爷:wsig
    b. 赵毅:
    ctx = ReuqestContext(session,request)
    ctx.push()
    c. 刘松:LocalStack,把ctx对象添加到local中
    d. 空调:Local
    __storage__={
    1321:{stack:[ctx,]}
    }

    session

    a. 温大爷:wsig
    b. 赵毅:
    ctx = ReuqestContext(session=None,request)
    ctx.push()
    c. 刘松:LocalStack,把ctx对象添加到local中
    d. 空调:Local
    __storage__={
    1321:{stack:[ctx,]}
    }
    e. 郭浩:通过刘松获取ctx中的session,给session赋值(从cookie中读取数据) => open_session

    总结

    请求上下文管理(ctx):request,session

    • - 请求到来之后wsgi会触发__call__方法,由__call__方法再次调用wsgi_app方法
    • - 在wsgi_app方法中:

      • - 首先将 请求相关+空session 封装到一个RequestContext对象中,即:ctx。
      • - 将ctx交给LocalStack对象,再由LocalStack将ctx添加到Local中,Local结构:
      • __storage__ = {
        1231:{stack:[ctx,] }
        }
      • - 根据请求中的cookie中提取名称为sessionid对应的值,对cookie进行加密+反序列化,再次赋值给ctx中的session
      • -> 视图函数
      • - 把session中的数据再次写入到cookie中。
      • - 将ctx删除

    • - 结果返回给用户浏览器

    • - 断开socket连接

     应用上下文管理

    视图函数中获取request或session

    方式一:直接找LocalStack获取
            from flask.globals import _request_ctx_stack
            print(_request_ctx_stack.top.request.method)
            
    方式二:通过代理LocalProxy(小东北)获取
            from flask import Flask,request
            print(request.method)

    应用上下文管理跟请求上下文管理几乎是一个翻版,流程差不多,就是存放数据的地方不同,用的方法不同而已。

    2. 上下文管理:
    	- 请求上下文(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() 

    总结 

    两类:
        请求上下文管理
        应用上下文管理
    流程:
        请求到来:
            将请求和session相关封装到ctx = RequestContext对象中。
            将app和g封装到app_ctx = AppContext对象中。
            再通过LocalStack对象将ctx、app_ctx封装到Local对象中。
            
        获取数据
            通过LocalProxy对象+偏函数,调用LocalStack去Local中获取响应ctx、app_ctx中封装的值。
            
            问题:
                为什么要把 ctx=request/session    app_ctx = app/g    ?
                答:因为离线脚本需要使用app_ctx。
        请求结束:
            调用LocalStack的pop方法,将ctx和app_ctx移除。
  • 相关阅读:
    Java8 Period.between方法坑及注意事项
    mybatis入门-第一个程序
    mybatis入门-框架原理
    初识servlet--未完成
    初识servlet
    session是什么
    session工作原理简介
    笔记本维修介绍
    j2se 总结
    maven
  • 原文地址:https://www.cnblogs.com/gaoya666/p/9188845.html
Copyright © 2011-2022 走看看