Django(五)中间件

一次请求的生命周期

我们先看客户端发起一次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(
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值