zoukankan      html  css  js  c++  java
  • flask进阶(上下文源管理源码浅析)


    目录

    一、flask上下文管理

    二、flask上下文管理源码浅析图

    flask上下文管理

    1. flask上下文管理定义

    简单理解为flask程序运行的生命周期

    2. flask上下文管理源码分析

    flask项目启动执行了app.run()方法,调用了werkzeug的run_simple()方法

    run_simple(host, port, self, **options) :
        self()
    

    self的入参为app,所以run_simple会执行self(),也就是app(), 那么app = Flask() 所以会走Flask的__call__方法

    那么__call__做了什么呢

    environ是请求来的原始数据~当成参数传递给了request_context方法

    RequestContext对象

    这是初始化这个类做的一些事情
    在这里重新封装了request, 以及给session 赋值了 None
    也就是说:
    ctx = RequestContext(app, environ)
    ctx.request 是重新封装的request
    ctx.session = None

    执行了_request_ctx_stack.push(ctx)
    也就是说_request_ctx_stack它把我们的ctx对象push到了一个地方
    我们的ctx这个对象里面有request以及session等



    __setattr__给Local类初始化了两个属性 storage = {} ident_func = get_ident

    继续看LocalStark中push方法做了什么:




    现在回去看wsgi_app里的ctx.push(),到这里,它就走完了,接下来就要走视图
    那到这里我们可以通过什么样的方法在我们视图中拿到这个request对象呢
    request在ctx对象里能通过ctx.request得到,那我们怎么得到ctx呢
    ctx被LocalStack对象放入到Local中了

    获取ctx:

    from flask import Flask
    from flask import globals
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def index():
        ctx = globals._request_ctx_stack.top
        print(ctx.request.method)
        return "index"
    
    if __name__ == '__main__':
        app.run()   
    

    这个request:
      from flask.globals import _request_ctx_stack
      ctx = _request_ctx_stack.top
      request = ctx.request

    和这个request:
      from flask import request

    两个request有什么区别?

    其实我们导入的request跟我们上面拿到的request是一样的。

    下面看看怎么直接拿request

    reqeust是LocalProxy这个类的实例化对象,参数是一个偏函数,
    那当我们调用request.method 等方法的时候走的是LocalProxy这个类的__getattr__方法


    这里的_get_current_object()相当于我们偏函数的执行

    因此,直接导入的request也是通过LocalStack方法去Local中取ctx对象
    然后通过getattr 找到ctx.request,
    也就是说这个LocalProxy就是一个帮助我们取值的代理,让我们的取值变的更加简单
    这个代理通过偏函数来绑定参数,
    ctx中封装了request,以及session,只不过到这里我们的session依然是空的。

    flask上下文管理源码浅析图

  • 相关阅读:
    Android Studio快速查看apk的MD5、SHA1、SHA256
    aapt remove 命令报 error during crunch archive is toast
    如何快速将MySQL数据库转换为PostgreSQL数据库
    Exception in thread “main“ org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
    idea2021奇葩问题:找不到程序包和符号
    Unable to find method ‘org.gradle.api.tasks.TaskInputs.property
    laravel response返回值精度问题
    中缀、前缀、后缀表达式的运算
    选择排序
    中缀表达式转后缀表达式
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/11278997.html
Copyright © 2011-2022 走看看