werkzeug LocalProxy

werkzeug LocalProxy1.当我们代理的理解fromwerkzeug.localimportLocalStack,LocalProxyl_stack=LocalStack()l_stack.push({‘name’:’wang’})l_stack.push({‘name’:’wei’})defget_name():returnl_stack.pop()#不用代理name=get_name()print(f”nameis{name[‘name’]}”)print(f”


Jetbrains全系列IDE稳定放心使用

1.当我们代理的理解

from werkzeug.local import LocalStack, LocalProxy

l_stack = LocalStack()
l_stack.push({ 
   'name': 'wang'})
l_stack.push({ 
   'name': 'wei'})


def get_name():
    return l_stack.pop()

# 不用代理
name = get_name()
print(f"name is {name['name']}")
print(f"name is {name['name']}")

# 结果
# wang
# wang

l_stack = LocalStack()
l_stack.push({ 
   'name': 'wang'})
l_stack.push({ 
   'name': 'wei'})


# 代理操作get_name
name2 = LocalProxy(get_name)
print(f"{name2['name']}") # 每次使用name2获取属性,相当于调用一次get_name方法
print(f"{name2['name']}")

# 结果
# wang
# wei

2.flask框架正是使用了这个代理的特点,可以在全局中获得当前的上下文,比如current_app,request,session和g

# context locals
_request_ctx_stack = LocalStack()
current_app = LocalProxy(lambda: _request_ctx_stack.top.app)
request = LocalProxy(lambda: _request_ctx_stack.top.request)
session = LocalProxy(lambda: _request_ctx_stack.top.session)
g = LocalProxy(lambda: _request_ctx_stack.top.g)

每次我们使用current_app时,都会从_request_ctx_stack.top.app的栈顶重新获取,如果不用代理

current_app = _request_ctx_stack.top.app

这样在调用current_app时则只会获得一次,而且以后都不会再改变

3.代理是如何实现的:

class LocalProxy(object):
# ... 省略部分代码
__getitem__ = lambda x, i: x._get_current_object()[i] # x是代理对象本身(上例中name2),i是要查询的属性

# 结合 __init__与 _get_current_object()方法来看。
class LocalProxy(object):
    __slots__ = ("__local", "__dict__", "__name__", "__wrapped__")

    def __init__(self, local, name=None):
        object.__setattr__(self, "_LocalProxy__local", local)
        object.__setattr__(self, "__name__", name)
        if callable(local) and not hasattr(local, "__release_local__"):
            object.__setattr__(self, "__wrapped__", local)

    def _get_current_object(self):
        if not hasattr(self.__local, "__release_local__"):
            return self.__local()
        try:
            return getattr(self.__local, self.__name__)
        except AttributeError:
            raise RuntimeError("no object bound to %s" % self.__name__)

参考:
https://zhuanlan.zhihu.com/p/103376446
https://www.cnblogs.com/daofaziran/p/10826357.html
https://www.cnblogs.com/flowell/p/local_local_proxy_local_stack.html
https://blog.csdn.net/weixin_38091140/article/details/93592079
https://segmentfault.com/a/1190000007663087
https://blog.tonyseek.com/post/the-context-mechanism-of-flask/
https://cizixs.com/2017/01/13/flask-insight-context/
https://werkzeug.palletsprojects.com/en/1.0.x/
https://www.cnblogs.com/caoxing2017/p/8282530.html
https://www.toptal.com/python/pythons-wsgi-server-application-interface
https://www.jianshu.com/p/995bd7ae463a

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185230.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MFC中的SetCapture、ReleaseCapture、GetCapture函数「建议收藏」

    MFC中的SetCapture、ReleaseCapture、GetCapture函数「建议收藏」转载地址:http://blog.csdn.net/laowu_/article/details/6839345  正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口。如果调用了SetCapture,之后无论鼠标的位置在哪,鼠标消息都发给指定的这个窗口,直到调用ReleaseCapture或者调用SetCapture设置另一个窗口为止。很多时候,窗口或控件在鼠标按下后,需…

    2022年5月29日
  • siamfc代码解读_分析SiamFC

    siamfc代码解读_分析SiamFC训练过程训练过程,网络的最终输出是17×17的responsemap.网络的输入需要保证两条支路上目标物体在输入图片的中心位置,且目标物体在整幅图像中有一定的占比。对于模板图片模板图片大小:127×127×3。以目标中心为裁剪中心,确定一个稍大的正方形(记边长为C)裁剪区域(可能会超出原图片,以图片颜色均值填充),然后再将裁剪区域resize到127×127大小。根据paper,C…

    2022年10月1日
  • mysql 触发器介绍「建议收藏」

    mysql 触发器介绍「建议收藏」触发器(Trigger)是MySQL中非常实用的一个功能,它可以在操作者对表进行「增删改」之前(或之后)被触发,自动执行一段事先写好的SQL代码。本教程带领大家在实践中学习,你将学到触发器

    2022年7月3日
  • mapminmax 用法

    mapminmax 用法mapminmax是MATLAB实现归一化的工具包,默认:(1)将矩阵的每行分别进行归一化;(2)每行的最大值最小值作为每行归一化的xmin和xmax;(3)将数据归一化到[-1,1].若要将数据归一化到0到1之间,即y∈[0,1],使用b=mapminmax(a,0,1);若给与确定的最大值和最小值作为每行的xmin和xmax,使用:b= mapminmax(a,0,1);PS.xmin…

    2022年6月30日
  • html5弹出层表单,layer弹出层实现表单提交

    html5弹出层表单,layer弹出层实现表单提交js$(“#info_withdraw”).on(‘click’,function(){//iframe层layer.open({type:2,title:’申请提现’,shadeClose:true,shade:0.6,area:[‘780px’,’600px’],content:’__URL__/withdraw’});});htmlbody{background-col…

    2022年7月13日
  • poj 1142_poj是什么意思

    poj 1142_poj是什么意思http://poj.org/problem?id=1142题意:找一个比n大的数字,这个数字要可以分解(这点很重要)成,分解的因子和,和这个数字的各位数字和,相等的话,输出这个数字思路:因为这个数字要可以分解,所以首先判断这个数是否是质数,这个很重要,因为质数不符合题意。然后对这个数字进行分解。递归分解。递归的时候也注意,有可能某个因子是质数,如果这个因子是质数,比如11,也要…

    2022年10月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号