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”

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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,sessiong

# 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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • volatile关键字到底有什么作用

    volatile关键字到底有什么作用提示:更多优秀博文请移步博主的GitHub仓库:GitHub学习笔记、Gitee学习笔记volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同…

  • 二叉树进行中序遍历的结果_层次遍历和中序遍历构建二叉树

    二叉树进行中序遍历的结果_层次遍历和中序遍历构建二叉树目录1.二叉树1.中序遍历1.二叉树1.中序遍历不论是二叉树、二叉排序树(搜索树),遍历是基础。至于什么是中序遍历,中规中矩的理论,可以参考这篇文章,二叉树中序遍历(递归+非递归)Java.,其中详细介绍了中序遍历实现的方法和结果,包括递归和非递归两种方式。…

  • 一致性哈希算法 Java实现

    一致性哈希算法 Java实现一致性哈希算法虚拟节点Java版本的简单实现。

  • 哈哈,你造原来程序猿这么多长处嘛

    哈哈,你造原来程序猿这么多长处嘛

  • 矿机和普通电脑区别_计算机挖矿是什么意思

    矿机和普通电脑区别_计算机挖矿是什么意思原标题:处理的挖矿机能当家用电脑用吗?现在购买划算吗?目前市场上的矿机主要分为两类,一类是PC架构的矿机,另一类是基于ASIC芯片的专业矿机。一般PC架构的矿机可以当做家用电脑用,但cpu性能较弱,功耗较高。基于ASIC芯片的专业矿机由于没有显卡,不支持主流的桌面操作系统,,所以无法当普通电脑使用。基于PC架构的矿机可以作为普通电脑使用,但cpu性能较弱,功耗较高!一般基于pc架构的矿机,cpu…

  • haxm intel庐_如何开启Intel HAXM功能「建议收藏」

    haxm intel庐_如何开启Intel HAXM功能「建议收藏」1.启用BIOS中的Intel(R)VirtualizationTechnology选项2.设置成功后,在控制台中输入scqueryintelhaxm。出现下图即为成功3.启动androidSDK,在Extras目录的最下边,勾选IntelHAXM项,并下载4.下载完成后,打开目录:Sdk\extras\intel\Hardware_Accelerated_Execution_…

发表回复

您的电子邮箱地址不会被公开。

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