Flask-上下文管理

在源码中分析上下文管理

第一阶段:将ctx(request,session)放到Local()对象中
第二阶段:视图函数导入:request/session
第三阶段:请求处理完毕
      - 获取session并保存到cookie
      - 将ctx删除

简单的请求上下文示意图

上下文管理中,要在视图中使用request和session实际上是通过LocalProxy找LocalStack取Local()中的ctx

from flask import Flask,request,session

app = Flask(__name__)




@app.route('/')
def hello_world():
    print(request)  #其实是调用了LocalProxy.__str__
    request.method  #LocalProxy.__getattr__(key='method')  #ctx中request,再去request中获取method
    request.args  #LocalProxy.__getattr__(key='arg')  #ctx中request,再去request中获取arg
    
    session['k1'] = 123  #LocalProxy.__setitem__(key=k1,value=123) ctx中session,再去session中给k1的设置值
    session['k1']   #LocalProxy.__getitem__(key=k1) ctx中session,再去session中获取k1对应的值
    
    return '哈哈哈'


if __name__ == '__main__':
    app.run()
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
View Code

请求上下文之视图的调用流程图

 flask上下文管理流程图

 

 flask请求流程图

 

 

 

 

 flask中的g可以用作单词请求中的全局变量

from flask import Flask,request,session,g

app = Flask(__name__)

@app.before_request
def before():
    g.x=666


@app.route('/')
def index():
    print(g.x)
    return '哈哈哈'

@app.route('/rout')
def rout():
    print(g.x)
    return 'hehehe'


if __name__ == '__main__':
    app.run()
View Code

 

  

问题  

1.flask中的session是什么时候创建的,什么时候销毁的
   答:请求刚进来的时候会讲request和session封装成RequestContext()对象,封装成对象之后通过LocalStack将它放入Local()对象中,由于封装到Local()对象中的ctx里面session是None,
      open_session拿到Local中的session对其进行赋值,在视图函数执行完之后会执行save_session,将session保存到浏览器的cookie中,并且将Local()对象中的ctx给pop删除

2.面向对象中有很多的双下方法,它都在什么地方用到过
答:在flask中的上下文管理中用到了,在视图中使用request和session其实都是通过LocalProxy去取的,LocalProxy中就封装了很多的双下方法

3.flask中一共有几个LocalStack和Local对象?
  答:在多线程和协程中只会创建两个LocalStack和两个Local对象,原因是一个用于存放请求上下文一个用于存放应用上下文

4.flask中g的生命周期是什么?
答:请求刚过来创建了一个g,请求结束后给销毁了,g在一个请求周期中存在

5.flask中g有什么用?
答:应用场景:做权限管理,可以在before_request中设置g,这样可以实现单词请求中设置全局变量 ,在django中是将权限写到session中了,然后再中间件中进行校验是否有权限

 

 

posted @ 2018-05-26 16:27  dwenwen  阅读(167)  评论(0编辑  收藏  举报