django中间件
django中间件
相当于django框架的保安,只要数据过来必须经过中间件的校验。
django中间件默认有7个。可以在setings内 MIDDLEWARE里查看
看着是字符串其实底层就是导模块的句式。通过了一些方法把他转换成成字符串的格式
自定义中间件
1.创建存储自定义中间件的py文件或目录
2. 参考自带的中间件的代码编写类并继承
3. 在类中编写5个可以自定义的方法
两个需要掌握的方法
process_request
class MyMiddleware001(MiddlewareMixin):
def process_request(self, request):
pass
1.请求来的时候会从上往下依次经过每一个注册的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
process_response
def process_response(self,request,response):
return HttpResponse('我自己替换了response')
1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
'''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 从返回HttpResponse对象的位置为基准,由下而上返回执行process_response'''
自己编写的中间件必须在settings里注册才能使用
MIDDLEWARE = [
'app01.mymiddleware.mymiddle.Mymiddleware001'
]
一般我们自己编写中间件都是放在自带中间件的最下方或上方,最好不要插在中间,会影响自带中间件的一些功能。
三个了解方法
1.process_view
路由匹配成功之后执行视图函数/类之前自动触发(顺序同process_request)
2.process_exception
视图函数/类执行报错自动触发(顺序同process_response)
3.process_template_response
视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)
基于django中间件的功能设计
插拔式功能设计
将各个功能制作成配置文件中字符串的形式,如果想要用就填写(插),如果不想用就给注释掉(拔)
s1 = 'bbb.b'
import importlib # importlib 帮助我们切割一个字符串拆分成导模块的方式。
res = importlib.import_module(s1) # from bbb imoport b
print(res)
编写一个消息通知功能
class Email(object):
def __init__(self):
pass # 模拟发送QQ之前需要做的准备操作
def send_msg(self,content):
print('来自于邮箱的消息:%s'% content)
QQ与微信代码就不展示了
启动文件
import aaa # 导入一个包,其实是导入包下的双下init.py
if __name__ == '__main__':
aaa.send_all('头好晕啊')
包下的init方法
from settings import NOTIFY_LIST
import importlib
def send_all(content):
for path in NOTIFY_LIST: # path等于是配置文件中的一个一个字符串
models_path,class_str_name = path.rsplit('.',maxsplit=1) # 切割字符串最右边的 .解压赋值
# 利用importlib 用字符串导模块 from aaa import email
models_name = importlib.import_module(models_path)
# 利用反射从模块里拿到方法
class_name = getattr(models_name,class_str_name) # 在email模块中拿到对应的Email类名
# 类名加括号产生对象
obj = class_name()
# 对象调用send方法
obj.send_msg(content)
配置文件
NOTIFY_LIST = [
'aaa.email.Email',
'aaa.QQ.Qq',
'aaa.weixin.WinXin',
]
此时,如果想要增加功能只需编写对应的功能后在配置文件类通过字符串导入,便会在init文件类循环获取并切割后用反射拿到字符串所对应的名字,产生一个对象,并调用send_msg方法。 如果某一个功能不需要只需要注释掉。