中间件
轻量级的插件系统,可以全局改变django的输入(请求)、输出(响应)。
中间件先执行,然后执行装饰器+视图
/carts/<str:user>/cart, 匹配可变的用户名,然后以位置参数传给视图
具体实现
-
根目录,添加一个包----middleware
__init__.py
mymiddleware.py -
mymiddleware.py 中定义 ----中间件类
from django.utils.deprecation import MiddlewareMixin
class MMW(MiddlewareMixin):
def process_request(self,request):
#进入路由之前处理请求
#禁止ip_list中的IP访问
cur_ip = request.META.get("REMOTE_ADDR")
if cur_ip in ip_list:
return HttpResponse("当前ip 无法访问")
else:
return None #可以走到路由
def process_view(self,request,callback,callback_args,callback_kwargs):
#callback,对应的视图函数
#进入视图之前,处理请求
s = request.session.get("username")
c = request.COOKIES.get("username")
# 判断用户是否登录
if s or c :
return None #继续走到视图
else:
#return redirect("/user/login/")
return HttpResponse("用户未登录")
def process_response(self,request,response):
#处理所有的响应
print("处理所有的响应")
return response/HttpResponse
def process_exception(self,request,exception):
#处理所有的视图异常
print("处理所有的视图的异常")
return HttpResponse("服务端异常")
def process_template_response(self,request,response):
print("处理模板响应")
#视图函数返回的响应对象具有render方法时,调用
#返回一个实现render方法的响应对象
return render(request,"index.html")
-
注册中间件
settings.py>MIDDLEWARE=[
xxxxxx
“middleware.mymiddleware.MMW”,
] -
一个中间件,就是一个类
在进入视图之前,中间件按照 注 册 顺 序 注册顺序 注册顺序执行
出视图后,按照 相 反 顺 序 相反顺序 相反顺序执行
每次服务启动,
中
间
件
实
例
化
一
次
,
后
续
一
直
使
用
中间件实例化一次,后续一直使用
中间件实例化一次,后续一直使用
实战
路由:/test/middleware
视图:test_mw_view
def test_mw_view(request,*args,**kwargs):
print(args)
print(kwargs)
return HttpResponse("xxxx")
中间件:
只允许IP-127.0.0.1 访问 /test/middleware五次,五次之后拒绝响应
项目代码
提取码:m2e6
中间件场景
- IP访问频率限制,如每分钟不能超过20次
- URL访问限制
若用户访问的是login视图,则放行,否则检查是否登录 - 返回缓存数据
查看服务端页面是否缓存,有则返回缓存页面,无再进入视图,–渲染页面—放入缓存