django中间件
django中间件
django默认有七个中间件 并且还支持用户自定义中间件
中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
需要掌握的
process_request
1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
process_response
1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
'''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 不是执行所有'''
需要了解的
process_view
process_exception
process_template_response
4.一定在配置文件中注册中间件才可以生效
importlib模块
importlib模块支持传递字符串来导入模块。
如下使用importlib模块与使用import句式会获得相同的结果。
使用importlib模块:
importlib中的字符串的结尾最小单位只能到py文件名,而不能是py文件的的某个变量名。
基于django中间件的功能设计
创建配置文件settings.py、启动文件start.py。再创建三个功能文件放入notify目录。
实现功能拆分,进行解耦合。
每个功能文件下,写一个功能类:
核心功能函数就是其中的 send_msg()方法
不同的类,当有相同的功能时,他们的名字也应该相同(多态性):
编写settings文件中的内容(类似于中间件)
我们想要导入 notify
这个目录也就是我们常说的导包
实际上导入的就是notitfy中的__init__
文件
所以我们应该在notify目录下面创建__init__
文件
在__init__
文件中导入settings.py文件内的列表:
for循环取出列表中的字符串,并使用rsplit方法做切分:
得到用字符串表示模块路径、模块中的类名:
使用importlib模块的功能,通过字符串获得模块类型:
由于模块也是对象,通过反射从模块中拿名字:(也就是拿到真正的类)
类名加括号产生对象:
这样就实现了我们通过类似于中间件的形式操作
在启动文件start
中 导入notify目录 进行点send_all()方法