flask请求流程详解

Posted fiona-zhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask请求流程详解相关的知识,希望对你有一定的参考价值。

先看一个流程图:

技术分享图片

1、当一个请求进入的时候,Flask框架首先会实例化一个Request Context,封装了请求信息,保存在Request中。生成请求上下文后,Flask框架会将请求上下文推入到_request_ctx_stack栈中。调用的就是Request Context上下文的push方法

技术分享图片 

   技术分享图片

 

 2、App Context 是如何入栈的呢?

  Request Context在入栈之前,会先去app_ctx_stack栈顶检查下,栈顶元素是否存在,如果栈顶元素为空或者不是当前对象,那么Flask会把App Context推入到app_ctx_stack栈中,然后才会把Request Context推入到request_ctx_stack中。

 

3、request和current_app,这两者用于都是指向各自栈的栈顶的

  技术分享图片

  

  如果栈顶元素时空的,Local Proxy将会出现unbound,这是后使用他们就会报出 working outside application context的错误,这个错误在Flask中,经常不小心就会遇到。

  所以出现这个错误的解决方案就是:当我们要使用current_app的时候,如果栈顶元素为空,那我们手动的将app context推入栈中,就不会出现这种情况了。

  一般流程是:

    ctx = app.get_context():获得APPContext应用上下文对象,

    然后调用 ctx.push() 方法就可以将其推入到栈中

    在使用完毕后,还需要调用ctx.pop() 将其从栈中弹出。

  上面的代码 可以 结合 with 语句 改写成上下文管理的方式 

    with app.app_context():

      pass

 

【栈:后进先出  队列:先进先出】

 

以上是关于flask请求流程详解的主要内容,如果未能解决你的问题,请参考以下文章

Flask Session 详解

flask基础之session原理详解

Flask框架 之 功能详解

springboot内置tomcat启动全流程详解及处理请求详解

python web开发-flask中responsecookiessession对象使用详解

Flask中url详解