Flask上下文管理、session原理和全局g对象

一、一些python的知识

1、偏函数

def add(x, y, z):
    print(x + y + z)

# 原本的写法:x,y,z可以传任意数字
add(1,2,3)

# 如果我要实现一个功能,这三个数中,其中一个数必须是3
# 我们就可以使用偏函数来帮着我们传参
from functools import partial

# partial:给add这个函数固定传一个数字 3
new_add = partial(add, 3)

# 因此新的函数只需要传2个参数
new_add(1,1)
new_add(1,2)

# 偏函数:就是帮我们给一个函数固定一个参数
# new_add(x1, x2) --> add(3, x1, x2)

2、类的两个双下方法

1. __getattr__:对象获取属性值的时候触发

2. __setattr__:对象设置属性值的时候触发

3.示例
class A(object):
    def __init__(self):
        # self.name = {}
        # 初始化的时候,给这个对象设置一个属性名为name,值为空的字典
        object.__setattr__(self, "name", {})

    def __getattr__(self, item):
        print("getattr: ", item)

    def __setattr__(self, key, value):
        print("setattr: ", self.name)
        print("setattr: ", key, value)
        self.name[key] = value
        print("setattr: ", self.name)

# 实例化,调用__init__
a = A()

# 获取对象某个属性的值,会调用__getattr__
# 如果A这个类没有__getattr__,就会去执行父类的__getattr__
# 但是严谨的__getattr__是:如果你没有这个属性,就会给你报错
# 我们可以在A类重写__getattr__,可以让它不报错
a.xxx  # getattr:  xxx

# 给对象的某个属性设置值,会调用__setattr__
# 执行的逻辑跟__getattr__一样,A类没有就去调用父类的
a.xxx = ‘小明‘
# 首先打印name字典的默认值:是个空字典 setattr:  {}
# setattr的key是左边的变量,value是右边的值:setattr:  xxx 小明
# 打印self.name这个字典:setattr:  {‘xxx‘: ‘小明‘}

二、Flask上下文管理

Flask的上下文管理我们可以理解为一个生命周期
也就是请求进来到请求出去一共做了哪些事情
首先我们知道项目启动执行了app.run()方法,调用了werkzeug的run_simple()方法
run_simple(host, port, self, **options) 这时候的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等

这个初始化方法就是刚才python类的双下方法__setattr__
就是给Local类初始化了两个属性    __storage__ = {}            __ident_func__ = get_ident

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


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

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()

获取ctx

三、Flask上下文管理(续)

四、session的实现原理

五、应用上下文管理

六、全局对象g

原文地址:https://www.cnblogs.com/Zzbj/p/10207128.html

时间: 2024-10-06 21:29:37

Flask上下文管理、session原理和全局g对象的相关文章

Flask 上下文管理-- (session,request,current_app的传递)

Flask session,request,current_app的传递 1 flask的 request, session 和 current_app 都是 设置方式比较新颖 -- 通过上下文管理的方式实现的 每次请求进来app.run调用 call 方法, 创建 一个本地线程(唯一标识作为键) -- 然后把实例化的对象push到一个地方,在请求结束后返回的时候 pop 掉 local = { '标识':{'stack':[RequestContext(),]} } 2 补充 partial

flask上下文管理

flask的上下文管理分应用上下文和请求上下文: 官方文档里是说先理解应用上下文比较好,不过我还是觉得反过来,从请求上下文开始记录比较合适,所以这篇先记录请求上下文. 那么问题来了,什么才是请求上下文: 通俗点说,其实上下文就像一个容器,包含了很多你需要的信息 request和session都属于请求上下文 request 针对的是http请求作为对象 session针对的是更多是用户信息作为对象 上下文的结构 说到上下文这个概念的数据结构,这里需要先知道,他是运用了一个Stack的栈结构,也就

python - Flask 上下文管理 流程

上下文管理:    - 请求上下文 (ctx=RequestContext())  : request/session    - App上下文  (app_ctx=AppContext())  : app/g 1. 请求进来执行 __call__ 方法.2. __call__ 方法调用 wsgi_app.3. wsgi_app:    - (1)实例化两个方法:    ctx = RequestContext(request,session)    app_ctx = AppContext(ap

flask内置session原理

内置session原理 请求到来 当请求进来之后,先执行Flask对象的 __call__ 方法 def wsgi_app(self, environ, start_response): # 获取请求相关数据,并进行封装和加工 ctx = self.request_context(environ) # 将请求消息推送到堆栈中,并执行 open_session方法 ctx.push() error = None try: try: response = self.full_dispatch_req

利用flask上下文管理原理,实现线程之间的数据安全

由于一般的程序基本上都是IO密集型,如果只是为了保证数据的安全而去开启进程,这必定是浪费资源的行为:为了保证数据的安全,借用flask的上下文的原理,如下代码实现 from threading import Threadimport time try: from greenlet import getcurrent as get_ident # 协程的唯一标识except ImportError: try: from thread import get_ident except ImportEr

flask上下文管理相关 - threading.local 以及原理剖析

threading.local 面向对象相关: setattr/getattr class Foo(object): pass obj = Foo() obj.x1 = 123 # object.__setattr__(obj,'x1',123) print(obj.x1) # object.__getattr__(obj,'x1') Local类的模拟 简易版 class Local(object): def __init__(self): # self.storage = {} object

深度剖析Flask上下文管理机制

前言 上下文这个概念多见于文章中,是一句话中的语境,也就是语言环境.一句莫名其妙的话出现会让人不理解什么意思,如果有语言环境的说明,则会更好,这就是语境对语意的影响. 上下文是一种属性的有序序列,为驻留在环境内的对象定义环境.在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等. 如在计算机中,相对于进程而言,上下文就是进程执行时的环境.具体来说就是各个变量和数据,包括所有的寄存器变量.进程打开的文件.内存信息等.可以理解上下文是环境的一个快照,是一个用

Flask 上下文管理

flask的request和session设置方式比较新颖,如果没有这种方式,那么就只能通过参数的传递. flask是如何做的呢? 1.Python 实现的本地线程 保证即使是多个线程,自己的值也是互相隔离. import threading local_values = threading.local() def func(num): local_values.name = num import time time.sleep(1) print(local_values.name, threa

flask上下文管理之threading.local

Flask之上下文管理 知识储备之问题情境: request中的参数: 单进程单线程 单进程多线程-->reqeust 会因为多个请求,数据发生错乱.--->可以基于threading.local对象 单进程单线程(多协程)threading.local对象做不到(因为一个线程下多个协程同享一个线程的资源) 解决办法: ? 自定义类似threading.local对象(支持协程)---保证多协程下数据的安全 先来看一下下面这段代码(支持多线程): # -*- coding: utf-8 -*-