flask基础之LocalProxy代理对象(八)
前言
flask框架自带的代理对象有四个,分别是request,session,g和current_app,各自的含义我们在前面已经详细分析过。使用代理而不是显式的对象的主要目的在于这四个对象使用太过频繁,贯穿整个请求周期,显式传递很容易造成循环导入的问题,需要一个第三方的对象来进行解耦。
代理模式简介
代理模式是程序设计的一种结构模式,其目的是使调用者和执行者之间不发生直接的关系,而是使用一个代理人,这样调用者和执行者就进行了解耦,可以避免许多的问题。
代理模式使用的场景:
为真实目标类创建一个对象的代价是昂贵的,而创建代理类很简单;
对象必须防止被用户直接使用。
当实际请求的时候,为真实目标类创建一个对象会有延迟。
class Boss(object):def task1(self):print('this is task1')def task2(self):print('this is task2')class Proxy(object):def __init__(self, obj):self.proxy = objdef task1(self):self.proxy.task1()def task2(self):self.proxy.task2()proxy_boss = Proxy(Boss())class Client(object):def do_something(self):proxy_boss.task1()
if __name__ == '__main__':c = Client()c.do_something()
上述的Boss实例不需要显式传递,受到了保护;Proxy对象相当于一个接口的作用。
LocalProxy代理对象
LocalProxy就是flask框架的werkzeug工具实现的一个代理对象,它接收一个可调用的无参数函数作为参数,内部实现了object对象所有的魔法方法的重写,理论上可以代理任何的对象,不管这个对象的结构是怎么样的。
class LocalProxy(object):def __init__(self, local, name=None):object.__setattr__(self, '_LocalProxy__local', local)object.__setattr__(self, '__name__', name)def _get_current_object(self):if not hasattr(self.__local, '__release_local__'):return self.__local() # 代理对象local必须是可调用的try:return getattr(self.__local, self.__name__)except AttributeError:raise RuntimeError('no object bound to %s' % self.__name__)
如果我们想在项目中的任何地方使用我们自己的全局代理对象,我们可以这样做:
# myproxy.py
from werkzeug.local import LocalProxyclass Boss(object):def pop(self):print('Ok')return 'OK'
class OtherObj(object):def __init__(self,Obj):self.real_obj = Obj()
other = OtherObj(Boss)
def get_boss(Obj=None):return Obj.real_objproxy_boss = LocalProxy(partial(get_boss, other))
get_boss这种形式是动态代理,也就是说在进程运行中由于OtherObj的real_obj属性可能发生变化,proxy_boss代理的对象可能发生改变。
参考
- https://dormousehole.readthedocs.io/en/latest/
转载于:https://www.cnblogs.com/cwp-bg/p/10084480.html
flask基础之LocalProxy代理对象(八)相关推荐
- 【零基础学Java】—对象的内存图(八)
[零基础学Java]-对象的内存图(八) 一.一个对象的内存图 二.两个对象的内存图 三.使用对象类型作为方法的参数 public class PhoneParam {public static vo ...
- Java基础:动态代理
系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...
- Bootstrap基础二十七 多媒体对象(Media Object)
Bootstrap<基础二十七> 多媒体对象(Media Object) 原文:Bootstrap<基础二十七> 多媒体对象(Media Object) Bootstrap 中 ...
- Java基础知识:代理
一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的. 动态代理技术就是用来产生一个对象的代理对 ...
- AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象...
现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...
- 学习spring必须java基础知识-动态代理
2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...
- python flask快速入门与进阶-Flask基础进阶与python flask实战bbs教程
├─Flask基础进阶 │ 01-HTTP 基础知识.mp4 │ 02-python CGI 与 WebServer.mp4 │ 03-virtuanenv配置及Flask快速示例.mp4 │ 04- ...
- Three.js(2)--->基础篇-Helpers(辅助对象/辅助线)
在Three.js中有许多的Helper(辅助对象)用来帮助我们的开发. 本篇例举几个常见的,方便理解.以及一些效果 文章目录 前言 一.AxesHelper 二.BoxHelper 三.Box3He ...
- Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了
动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...
最新文章
- 图灵奖得主Bengio明星创业公司被「贱卖」| AI日报
- @MyBatis主键返回
- python 单通道转3通道
- 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识
- python discuz搜索api_python如何模拟搜索引擎分词
- 零基础入门Python:基本命令、函数、数据结构
- java SSH编码规范
- 统计xml文件中的标签出现框数及出现过的图片数
- python画条形图-Python数据可视化:基于matplotlib绘制「条形图」
- thinkphp5 router.php,ThinkPHP5 之route(路由)简述
- 01_项目需求与实体分析(servlet+java bean+jsp的商城教程)
- C语言日志库zlog的简单配置及使用
- Geek(一个好用的强力卸载软件工具,包括注册表所有依赖项全部清理掉)
- 雨人系统ORA-01821,时间无法识别
- AutoCAD.NET开发:PaletteSet
- linux怎么添加桌面图标,linux下添加桌面图标
- 计算机显示无法格式化,U盘无法格式化怎么办?Win7提示Windows 无法完成格式化的解决方法...
- 论文摘要怎么写——分享5个较好的摘要
- csv文件用excel打开中文乱码如何设置
- C语言 输入一个正整数,判断它是素数还是合数