• 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

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

  • 相关阅读:
    Regular Expression Matching
    Palindrome Number
    String to Integer (atoi)
    Reverse Integer
    ZigZag Conversion
    Longest Palindromic Substring
    Add Two Numbers
    git 操作原理
    ES6学习之路2----变量的解构赋值
    ES6学习之路1----变量的声明
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/10102111.html
Copyright © 2020-2023  润新知