赞
踩
我们先看客户端发起一次http请求的流程
注:django框架不包括socket, 要借助图中的两个模块来实现socket,进行客户端和服务端通信。wsgi性能较弱,一般测试开发用;企业中用uwsgi,性能强,并发好。
从图上可知,请求在到达视图之前,会依次执行中间件,视图返回的响应,依次倒序执行中间件。
在django中,中间件的是一个个的类,类中定义了一些方法。在django项目的setting.py文件中,有一个MIDDLEWARE列表,其中每一个元素都是一个中间件。
如果需要对请求作统一处理,比如在执行视图前,验证登录,日志记录,我们可以用装饰器,但是很麻烦,每个视图都要手动加装饰器语法。这时如果用中间件会更方便。
从上图我们发现,MIDDLEWARE列表中的每一个元素都是字符串,那么Django是如何通过字符信息执行的中间件呢。
观察中间件元素发现由两部分构成:路径+类名;因此如果能分离出路径,并根据路径导入模块,然后执行模块中类的方法,就可以了。
关键问题是路径和类名都是字符串,通过字符串路径导入模块要借助importlib模块;在模块中通过字符串拿到类和在类中根据字符串拿到方法,都可以通过反射来做。
下面我们来自己模拟一下:
PLUGIN = {
'disk': 'plugin.disk.Disk',
'memory': 'plugin.memory.Memory',
'network': 'plugin.network.Network',
}
这里用了字典的形式,原理是一样的。
import importlib # 通过字符串导入模块
for k, v in PLUGIN.items():
# 分离模块路径 和 类名:
# 'plugin.disk.Disk' --> 模块路径'plugin.disk' 类名 'Disk' (结果都是字符串)
# 通过字符串路径导入模块 importlib
# 通过反射获取模块中的类
module_name, cls_name = v.rsplit(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。