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__做了什么呢
1480307-20190731210017358-798844776.png

environ是请求来的原始数据~当成参数传递给了request_context方法
1480307-20190731210125441-571482608.png

RequestContext对象
1480307-20190731210158834-1511122145.png

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

执行了_request_ctx_stack.push(ctx)
也就是说_request_ctx_stack它把我们的ctx对象push到了一个地方
我们的ctx这个对象里面有request以及session等
1480307-20190731210406549-1471659154.png
1480307-20190731210413063-629504315.png
1480307-20190731210418542-699264646.png
1480307-20190731210425537-2095946085.png

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

继续看LocalStark中push方法做了什么:
1480307-20190731210731744-1543279759.png
1480307-20190731210756693-1080426387.png
1480307-20190731210803358-1474598558.png
1480307-20190731210811863-557762947.png
1480307-20190731210818402-463904899.png

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

获取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
1480307-20190731211234049-1147546692.png

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

1480307-20190731211307450-1376636443.png
这里的_get_current_object()相当于我们偏函数的执行
1480307-20190731211327758-1072286050.png

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

flask上下文管理源码浅析图

1480307-20190731215446928-809316253.png

转载于:https://www.cnblogs.com/zhangliang91/p/11278997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值