中间件(MiddleWare)
定义
面向切面编程(IoC), 为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能。它是一个轻量,低级别的插件系统,用于全局范围内改变Django的输入,输出。每个中间件组件都负责做一些特定的功能。
内置的六个切点(钩子函数)
- _ _init _ _初始化函数:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。
- process_request(self,request):在执行视图前被调用,多个中间件情况,按照setting.py中注册顺序执行。
- process_view(self,request,view_func,view_args,view_kwargs):调用视图之前执行,按照注册顺序执行。
- process_template_response(self,request,response):在视图刚好执行完后进行调用
- process_exception(self,request,exception):视图函数抛出异常时调用,按照注册顺序倒叙执行。
- process_response(self,request,response):所有响应返回浏览器之前调用,按照注册顺序倒叙执行。
每个方法都可以返回None或者返回HttpResponse对象。如果是none,继续按照django定义的向下执行,如果返回是Httpresponse对象,则直接将该对象返回给用户。
自定义中间件
规则
1.要继承MIDDLEWAREMIXIN类,
2.要重写父类方法
3.将类添加到setting.py文件中MIDDLEWARE配置项里
实例之——登录验证
1.setting.py 文件在MIDDLEWARE中注册
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',
'beau.a.b' # 自定义中间件 子app名.自定义中间件文件名.类名
]
# 放行url,不进行登录验证
EXCLUDE_URL = [
"/login"
]
# 用户名密码
USERS = [
("a", "a")
]
2.在子app中自定义py文件
import re
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from Novel.settings import EXCLUDE_URL, USERS
exclued_path = [re.compile(item) for item in EXCLUDE_URL]
class b(MiddlewareMixin):
"""
访问控制
"""
def process_request(self, request):
# 放行
url_path = request.path
for each in exclued_path:
if re.match(each, url_path):
return None
# 验证
user = request.session.get('user')
password = request.session.get('password')
if (user, password) in USERS:
return None
else:
return redirect('/login')