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

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

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

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


相关推荐

  • 京东云服务器免费体验_京东云服务器免费体验

    京东云服务器免费体验_京东云服务器免费体验1元体验京东云服务器在大神鸿洋和郭霖的微信公众号推送文章发现了这个好消息,第一时间注册了账号,申请下了订单,毕竟数量有限。尽管两位大神讲的很详细,无奈没有接错过CentOS、Ubuntu、WindowsServer这些服务器系统的小白,还是有些地方不是很清楚,正所谓,打破砂锅问到底,不仅要知其然还要知其所以然;经过一段时间的琢磨。还是搞明白了。CentOS和Ubuntu的相同与不同CentO

    2022年10月14日
    0
  • ping, telnet, tcping 命令使用及对比

    ping, telnet, tcping 命令使用及对比1.ping命令ping命令只能检查IP的连通性或网络连接速度,无法具体到某个端口。ping命令使用ICMP协议,跟IP协议属于同一层次(网络层)。ping命令在每次发数据包后都会等对方返回数据包。可以禁止ICMP协议,此时对方收到消息后不会回复。端口是传输层TCP/UDP协议的概念,比如常用的web端口指的是TCP的80端口。使用网络层的pi…

    2022年6月23日
    67
  • java简单入门教程_史上最快速最简单的java入门教程

    java简单入门教程_史上最快速最简单的java入门教程原标题:史上最快速最简单的java入门教程§java是什么?Java是一门开发软件的程序语言,用于编写比如:办公自动化软件、超市的销售系统、银行交易系统等程序软件.§准备写Java程序。准备工作分为三步:第一步:下载安装JDK开发环境(建议官网下载),基本都是下一步。第二步:配置JDK环境变量,主要配置bin和classpath(主要为了在控制台能方便执行程序。如果不怕麻烦,此步可以省略)。具体…

    2022年7月8日
    20
  • 地理加权回归学习记录「建议收藏」

    地理加权回归学习记录「建议收藏」地理加权回归GWR白话空间统计二十四:地理加权回归(三)地理加权回归可以用来量化空间异质性。研究区域——利用每个要素的不同空间位置计算距离衰减函数——把每个要素的空间位置(一般是坐标信息(x,y))和要素的值带入到这个函数里面之后,就可以得到一个权重值,这个值就可以带入到回归方程里面去这个衰减函数的理论基础,正是Tobler提出所谓的“地理学第一定律(Tobler’sFirstLaw或者Tobler’sFirstLawofGeography):位置越接近的数据,比远处的数据对结果的影响更

    2022年9月28日
    0
  • win7 64位wamp2.5无法启动MSVCR110.DLL丢失听语音

    win7 64位wamp2.5无法启动MSVCR110.DLL丢失听语音

    2021年9月23日
    60
  • 数据结构中各种时间复杂度_时间复杂度o(n)

    数据结构中各种时间复杂度_时间复杂度o(n)目录一、概念1.1、算法效率1.2、时间复杂度1.3、空间复杂度二、计算2.1、大O的渐进表示法2.2、时间复杂度计算例题:2.3、空间复杂度计算例题三、有复杂度要求的习题一、概念1.1、算法效率算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作…

    2025年8月1日
    0

发表回复

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

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