zoukankan      html  css  js  c++  java
  • 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,这两者用于都是指向各自栈的栈顶的,也就是说使用current_app和request的时候,都是在间接的操作_app_ctx_stack和_request_ctx_context栈顶元素。

      

      

      如果栈顶元素时空的,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

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

  • 相关阅读:
    Ionic
    图片破碎 效果 修正
    去掉浏览器右侧动滚条宽度对页面的影响
    ng 依赖注入
    ng 通过factory方法来创建一个心跳服务
    ng 自定义服务
    ng $http 和远程服务器通信的一个服务。
    ng $interval(周期性定时器) $timeout(延迟定时器)
    ng $scope与$rootScope的关系
    函数重载
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/10102111.html
Copyright © 2011-2022 走看看