1、简单的理解,1个中间件就是1个类,中间件一般可以用来检查用户是否登录。
2、用户通过浏览器访问视图函数的内容需要先通过中间件,通过中间件后再到视图函数,返回结果也需要通过中间件,如下草图
3、自定义一个中间件
3.1 在应用目录下新建 middleware 文件夹,新建一个auth.py文件
我的目录结构:appback-middleware-auth.py
3.2 创建两个类 M1 和 M2
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
# 定义一个中间件 M1
class M1(MiddlewareMixin):
def process_request(self,request):
print("M1.进来了")
def process_response(self,request,response):
print("M1.出去了")
return response
# 定义一个中间件 M2
class M2(MiddlewareMixin):
def process_request(self,request):
print("M2.进来了")
def process_response(self,request,response):
print("M2.出去了")
return response
3.3 在settings.py 中注册中间件
3.3 重启项目运行,结果如下:
如此两个中间件就算创建成功了,浏览器访问我们的视图函数,先通过 M1 -> M2,返回时是 M2 -> M1。
4、如果 process_request 拥有返回值
4.1 在中间件 M1新增
return HttpResponse("无权限访问")
如下图
4.2 再次进入项目,可以发现访问在M1就结束了,并未到 M2以及视图函数。
4.3 如下草图所示:
5、案例登录
5.1 步骤:
1、排除不需要登录就能访问的 url ;
2、获取浏览器中 session 中的用户信息判断是否是登录用户;
3、已经登录过的直接放行,未登录过用户重定向到登录页;
5.2 简易实现代码
class AuthMiddleware(MiddlewareMixin):
def process_request(self,request):
# 排除不需要登录就能访问的页面
if request.path_info == "/login": # 获取当前用户请求的 url
return
# 读取当前访问用户的 session 信息
info_dict = request.session.get("info")
if info_dict:
return
# 没有登录回到登录页面
return redirect('/login')
def process_response(self,request,response):
return response