前言

flask框架自带的代理对象有四个,分别是request,session,g和current_app,各自的含义我们在前面已经详细分析过。使用代理而不是显式的对象的主要目的在于这四个对象使用太过频繁,贯穿整个请求周期,显式传递很容易造成循环导入的问题,需要一个第三方的对象来进行解耦。

代理模式简介

代理模式是程序设计的一种结构模式,其目的是使调用者和执行者之间不发生直接的关系,而是使用一个代理人,这样调用者和执行者就进行了解耦,可以避免许多的问题。

代理模式使用的场景:

  • 为真实目标类创建一个对象的代价是昂贵的,而创建代理类很简单;

  • 对象必须防止被用户直接使用。

  • 当实际请求的时候,为真实目标类创建一个对象会有延迟。

  1. class Boss(object):
  2. def task1(self):
  3. print('this is task1')
  4. def task2(self):
  5. print('this is task2')
  6. class Proxy(object):
  7. def __init__(self, obj):
  8. self.proxy = obj
  9. def task1(self):
  10. self.proxy.task1()
  11. def task2(self):
  12. self.proxy.task2()
  13. proxy_boss = Proxy(Boss())
  14. class Client(object):
  15. def do_something(self):
  16. proxy_boss.task1()
  17. if __name__ == '__main__':
  18. c = Client()
  19. c.do_something()

上述的Boss实例不需要显式传递,受到了保护;Proxy对象相当于一个接口的作用。

LocalProxy代理对象

LocalProxy就是flask框架的werkzeug工具实现的一个代理对象,它接收一个可调用的无参数函数作为参数,内部实现了object对象所有的魔法方法的重写,理论上可以代理任何的对象,不管这个对象的结构是怎么样的。

  1. class LocalProxy(object):
  2. def __init__(self, local, name=None):
  3. object.__setattr__(self, '_LocalProxy__local', local)
  4. object.__setattr__(self, '__name__', name)
  5. def _get_current_object(self):
  6. if not hasattr(self.__local, '__release_local__'):
  7. return self.__local() # 代理对象local必须是可调用的
  8. try:
  9. return getattr(self.__local, self.__name__)
  10. except AttributeError:
  11. raise RuntimeError('no object bound to %s' % self.__name__)

如果我们想在项目中的任何地方使用我们自己的全局代理对象,我们可以这样做:

  1. # myproxy.py
  2. from werkzeug.local import LocalProxy
  3. class Boss(object):
  4. def pop(self):
  5. print('Ok')
  6. return 'OK'
  7. class OtherObj(object):
  8. def __init__(self,Obj):
  9. self.real_obj = Obj()
  10. other = OtherObj(Boss)
  11. def get_boss(Obj=None):
  12. return Obj.real_obj
  13. proxy_boss = LocalProxy(partial(get_boss, other))

get_boss这种形式是动态代理,也就是说在进程运行中由于OtherObj的real_obj属性可能发生变化,proxy_boss代理的对象可能发生改变。

参考

flask基础之LocalProxy代理对象(八)的更多相关文章

  1. flask基础之Response响应对象(九)

    前言 Response对象负责对客户端的响应,每一个请求都会有一个Response对象,那么它在一个请求的声明周期内是怎么发挥作用的呢? Response对象 响应发生的位置 先回顾一下http请求的 ...

  2. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  3. Flask基础全套

    Flask简介 Flask是主流PythonWeb三大框架之一,其特点是短小精悍以及功能强大从而获得众多Pythoner的追捧,相比于Django它更加简单更易上手,Flask拥有非常强大的三方库,提 ...

  4. flask基础之请求处理核心机制(五)

    前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...

  5. Flask中current_app和g对象

      Flask零基础到项目实战(七)请求方法.g对象和钩子函数 一.get方法 二.post方法 post请求在模板中要注意几点: input标签中,要写name来标识这个value的key,方便后台 ...

  6. Flask【第2篇】:Flask基础

    Flask基础 知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name ...

  7. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  8. Java基础知识:代理

    一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的. 动态代理技术就是用来产生一个对象的代理对 ...

  9. Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数

    本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/binder --- ...

随机推荐

  1. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  2. mark1-git

    Administrator@-20131003RY MINGW64 ~ $ pwd /c/Users/Administrator Administrator@-20131003RY MINGW64 ~ ...

  3. 小程序开发 event对象中 target和currentTarget 属性的区别。

    首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素 p包含在div内 在outer上点击时,target跟currentTarget ...

  4. webgl 混合

    先上例子 <!doctype html> <html> <head> <meta charset="utf-8" /> <ti ...

  5. win 批处理

    前言 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务.用户只需双击批处理文件便可执行任务,而无需重复输入相同指令.编写批处理文件非常简单,但难点在于确保一切按顺序 ...

  6. Vue实现对数组、对象的深拷贝、复制

    当组件间传递对象时,由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝),如下 数组: ,,]; var b = a; b.p ...

  7. Js实现input上传图片并显示缩略图

    用这个方法就可以很方便快捷的实现上传图片并显示缩略图的效果: FileReader 的 readAsDataURL() 先创建一个img标签,再用 fileReader 把input文件的赋值到img ...

  8. codeforces1A

    Theatre Square CodeForces - 1A 一个城市的广场面积有 N×M平方米,过段时间,恰逢这个城市的庆典活动,主办方决定在广场上铺设一种新的地砖,这种地砖每块都是a×a平方米的. ...

  9. poj2135 Farm Tour(费用流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  10. oralce下载

    oracle的官网网址:oracle.com 打开之后选择中文 然后在页面的下方找到下载和试用链接 点击进入,选择数据库下载,在页面中找到如下部分点击进入即可下载对应版本的oracle