Flask上下文管理源码分析

Posted stfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask上下文管理源码分析相关的知识,希望对你有一定的参考价值。

上下文管理本质(类似于threading.local):

  1.每一个线程都会在Local类中创建一条数据:

{
  "唯一标识":{stark:[ctx,]},
  "唯一标识":{stark:[ctx,]},    
}

  2.当请求进来之后,将请求相关数据添加到列表里面[request,],以后如果使用时,就去读取。

  3.列表中的数据,请求完成之后,将request从列表中移除,

 

在源码中分析上下文管理:

  1,存数据,2,执行视图函数,3,请求结束。

  第一阶段:执行__call__--->app.wsgi-->将ctx(request,session)封装为RequestContext()在(open_session),app_ctx(g,app)封装为APPContent()通过LocalStack将这两个类放入Local对象中。

# 在封装到RequestContext()时,
# request = Request对象
# session = None

# 在执行ctx.push()时,才给session赋予了值。

# ctx.session = self.session_interface.open_session(self,request)

  第二阶段:视图函数导入:request/session/g/app,通过偏函数(_lookup_req_object)在通过(LocalProxy())去LocalStack中的Local类中对其进行增删改查操作。

# 执行视图函数

# response = self.full_dispathch_request()  读取ctx.session将数据写入到浏览器的cookie中。

# 执行偏函数

# request = LocalProxy(partial(_lookup_req_object,"reqeust"))
# _local = 偏函数
# __getattr__
#    ctx.request.method    ( top, pop ....)

#    ctx.request.args


# session 也在此时写入数据

# session = LocalProxy(partial(_look_req_object,"session"))

# _local = 偏函数
# __setitem__
#     ctx.session["xx"] == 123

 

  第三阶段:请求处理完毕:

    通过save_session将签名session保存到cookie.

    通过ctx.pop()去LocalStack中的Local类中将ctx删除。

 

技术分享图片

 

 

有关面试问题:

flask和django的区别:
    对于django来说,内部组件特别多,自身功能强大,大而全,。
    flask内置组件很少,但是第三方组件很多,扩展性强。
    因为他们两个框架都没有写socket,都是基于wsgi协议做的,除此之外,flask框架中的上下文管理较为耀眼。
    相同点:都没有socket,都是基于wsig协议做的。
    不同点:
        请求相关的数据传递的方式不同:
            django:通过传递request参数取值。
            flask:
        组件不同:
            django:大而全。
            flask:第三方组件多。

 

flask上下文管理:

  简单来说,flask上下文管理可以分为三个阶段:

    1,请求进来时,将请求相关的数据放入上下文管理中。

    2,在视图函数中,要去上下文管理中取值。

    3,请求响应,要将上下文管理中的数据清除。

  详细点来说:

    1,请求刚进来,将request,session封装在RequestContext类中,app,g封装在AppContext类中,并通过LocalStack将reqeustcontext和appcontext放入Local类中。

    2,视图函数中,通过LocalProxy-->偏函数-->LocalStack-->Local取值。

    3,请求响应时,先执行save.session()再各自执行pop(),将Local中的数据清除。

 


以上是关于Flask上下文管理源码分析的主要内容,如果未能解决你的问题,请参考以下文章

flask请求上下文管理源码分析

Flask系列之源码分析

flask 请求处理流程及其源代码分析sessioncookie生成源码

Flask上下文源码分析

剖析Flask上下文管理(源码)

Flask请求和应用上下文源码分析