首页 > 其他 > 详细

第六章 Flask-其他知识点(三)

时间:2020-03-11 22:07:13      阅读:48      评论:0      收藏:0      [点我收藏+]

 

 

 

local线程隔离对象

Local对象:
在Flask中,类似于request的对象,当绑定到了一个werkzeug.local.local对象时,即使是同一个对象,那么在多个线程中都是隔离的。

Thread Local对象:

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

技术分享图片

 

技术分享图片

from threading import Thread
from werkzeug.local import Local

local = Local()

local.request = 123
gobal_request=aaa
class MyThread(Thread):
    def run(self):
        #注意1
        # print(‘子线程:‘, local.request) 报错

        local.request = abc
        print(子线程:,local.request)

        global gobal_request
        gobal_request=bbb


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

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

技术分享图片

 

app上下文和request上下文

 

应用上下文和请求上下文都是存放到一个LocalStack的栈中。

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

1.在视图函数中,不用担心上下文的问题。因为视图函数要执行,那么肯定是通过访问ur的方式执行的,那么这种情况下,Flask底层就已经自动的帮我们把请求上下文和应用上下文都推入到了相应的栈中。

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

app上下文

技术分享图片

 

技术分享图片

 

技术分享图片

方法一:

app = Flask(__name__)
app.config[SECRET_KEY] = os.urandom(24)

app_context=app.app_context()
app_context.push()

print(current_app.name)

上面黄色代码完整装栈过程。

技术分享图片

 

 

 方法二:

app = Flask(__name__)
app.config[SECRET_KEY] = os.urandom(24)

with app.app_context():
    print(current_app.name)

 

请求上下文

@app.route(/)
def index():
    print(url_for("list_func")) #没问题
    return "ok"
@app.route(/list/)
def list_func():

    return "ok-list"
print(url_for("list_func")) #报错

技术分享图片

 

 

 当我们加上:

app_context=app.app_context()
app_context.push()

继续报错:

技术分享图片

 

 

 源码追踪:

技术分享图片

 

 

 解决方案

with app.test_request_context():
    print(url_for("list_func"))

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

1. 应用上下文:Flask底层是基于werkzeug,werkzeug是可以包含多个app的,所以这时候用一个栈【这个栈是单例的】来保存。如果你在使用app1,那么app1应该是要在栈的顶部,如果用完了app1,那么app1应该从栈中删除。方便其他代码使用下面的app。

2. 如果在写测试代码,或者离线脚本的时候,我们有时候可能需要创建多个请求上下文,这时候就需要存放到一个栈中了。使用哪个请求上下文的时候,就把对应的请求上下文放到栈的顶部,用完了就要把这个请求上下文从栈中移除掉。

 

线程隔离的g对象使用详解

保存全局对象的g对象:

g对象是在整个Flask应用运行期间都是可以使用的。并且跟request一样,是线程隔离的。这个对象是专门用来存储开发者自己定义的一些数据,方便在整个Flask程序中都可以使用。

一般使用就是,将一些经常会用到的数据绑定到上面,以后就直接从g上面取就可以了,而不需要通过传参的形式,这样更加方便。

第六章 Flask-其他知识点(三)

原文:https://www.cnblogs.com/wqbin/p/12465338.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!