Flask上下文

                                            Flask上下文

flask上下文分为 应用上下文 请求上下文。

1、关于wsgi

WSGI(全称Web Server Gateway Interface),是为 Python 语言定义的Web服务器Web应用程序之间的一种简单而通用的接口,它封装了接受HTTP请求解析HTTP请求发送HTTP响应等等的这些底层的代码和操作,使开发者可以高效的编写Web应用。

werkzeug是一个实现了wsgi协议的模块,flask内部使用的wsgi模块就是werkzeug 。

2、Local对象:

在Flask中,类似于request的对象,其实是绑定到了一个werkzeug.local.Local对象上。这样,即使是同一个对象,那么在多个线程中都是隔离的。类似的对象还有session以及g对象。

from threading import Thread
from werkzeug.local import Local

local = Local()

local.request = '123'


class MyThread(Thread):
    def run(self):
        local.request = 'abc'
        print('子线程:', local.request)


mythread = MyThread()
mythread.start()
mythread.join()

print('主线程:', local.request)

 结果:

是线程隔离的。

3、Thread Local对象:

只要满足绑定到这个对象上的属性,在每个线程中都是隔离的,那么他就叫做Thread Local对象。

4、应用上下文和请求上下文

应用上下文和请求上下文都是存放到一个LocalStack的栈中。和应用app相关的操作就必须要用到应用上下文,比如通过current_app获取当前的这个app。和请求相关的操作就必须用到请求上下文,比如使用url_for反转视图函数。

如果想要在视图函数外面执行相关的操作,比如获取当前的app(current_app),或者是反转url,那么就必须要手动推入相关的上下文

# 添加到应用上下文
with app.app_context():
    print(current_app.name)


def app_context(self):
       
   return AppContext(self)

 手动推入请求上下文:推入请求上下文到栈中,会首先判断有没有应用上下文,如果没有那么就会先推入应用上下文到栈中,然后再推入请求上下文到栈中:

# 手动推入请求上下文
with app.test_request_context():
    # 手动推入一个请求上下文到请求上下文栈中
    # 如果当前应用上下文栈中没有应用上下文
    # 那么会首先推入一个应用上下文到栈中
    print(url_for('my_list'))


def test_request_context(self, *args, **kwargs):
    try:
        return self.request_context(builder.get_environ())
    finally:
        builder.close()


def request_context(self, environ):   
    return RequestContext(self, environ) #返回请求上下文

5、为什么上下文需要放在栈中

  1.  应用上下文:Flask底层是基于werkzeug,werkzeug是可以包含多个app的,所以这时候用一个栈来保存。如果你在使用app1,那么app1应该是要在栈的顶部,如果用完了app1,那么app1应该从栈中删除。方便其他代码使用下面的app。
  2.  如果在写测试代码,或者离线脚本的时候,我们有时候可能需要创建多个请求上下文,这时候就需要存放到一个栈中了。使用哪个请求上下文的时候,就把对应的请求上下文放到栈的顶部,用完了就要把这个请求上下文从栈中移除掉。

6、g对象

g作为flask程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g保存的是当前请求的全局变量,不同的请求会有不同的全局变量。

g是在整个Flask应用运行期间都是可以使用的。并且他也是跟request一样,是线程隔离的。这个对象是专门用来存储开发者自己定义的一些数据,方便在整个Flask程序中都可以使用。一般使用就是,将一些经常会用到的数据绑定到上面,以后就直接从g上面取就可以了,而不需要通过传参的形式,这样更加方便。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值