文章目录
第一节:中间件简介
中间件的作用:
1、做统计
2、控制黑名单和白名单
3、反爬(redis)
4、界面友好化(捕获异常)等
部份概念
1、OOP 与 AOP
OOP叫面向对象编程(object-oriented(导航)-programming)
AOP又叫面向切面编程或中间件(Aspect-oriented(导航)-programming )
2、切点
切点,又叫“勾子”。切点允许我们动态地在原有逻缉中插入一部分代码
在不修改原有代码的情况下,动态注入一部分代码
默认情况,不中断传播,切点会自动愈合(自动执行原有逻缉)
如果我们执行了中断操作(return 或 raise),没接上,会值到和序结尾
3、中间件的制作流程
**
1、在工程目录下创建mdiileware目录
2、继承MiddleWareMixin
3、覆写切点方法,实现自己想要的功能
4、在settings.py内进行注册**
框架内置的切点
中间件代码参考
切点部位 | 相关代码 | 说明 |
---|---|---|
__ init__() | 没有参数,服务器响应第一个请求的时候自动调用,用户确定是否启用该中间件 | |
请求时 | process_request(self,request) | 在执行视图前被调用,每个请求上都会调用;不返回或返回HttpResponse对象 |
调用视图前 | process_view(self,request,view_func,view_args,view_kwargs) | 调用视图之前执行,每个请求都会调用;不返回或返回HttpResponse对象 |
模板渲染后 | process_template_response(self,request,response) | 在视图刚好执行完后进行调用,每个请求都会调用;不返回或返回HttpResponse对象 |
返回前 | process_response(self,request,response) | 所有响应返回浏览器之前调用,每个请求都会调用;不返回或返回HttpResponse对象; |
process_exception(self,request,exception) | 当视图抛出异常时调用;不返回或返回HttpResponse对象 |
中间件范本代码
# 继承框架中间件
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
class MyappMiddleware(MiddlewareMixin):
# 下钩子于所有路由被交给路由表之前
def process_request(self, request):
print(">>>>>>>>>> process_request", request)
# 下钩子于所有路由请求被交给视图函数之前
def process_view(self, request, view_func, view_args, view_kwargs):
print(">>>>>>>>>> process_view", request, view_func, view_args, view_kwargs)
# 理论上下钩子于所有路由请求的模板被渲染完成以后,实测无法回调
def process_template_response(self, request, response):
print(">>>>>>>>>> process_template_response", request, response)
return response
# 下钩子于所有路由的响应被返回之前
def process_response(self, request, response):
print(">>>>>>>>>> process_response", request, response)
return response
# 统一处理所有异常,当前任何异常都重返主页
def process_exception(self, request, exception):
print(">>>>>>>>>> process_exception", request, exception)
return redirect('/')
第二节:搭建工程
1、项目目标
1、黑名单用户访问任何页面都重定向到指定网页
2、福利页、抽奖页必须登录才能查看
3、福利页给VIP用户显示福利,给一般用户显示普通福利
4、发生任何异常都跳转到指定网页
2、前期准备
1、项目工程准备
参考文档第一章:hello,DJgo第三节:创建工程项目与整合TV
运行结果:
2、其他页面准备
第三节:中间件实现
搭建中间件框架
1、在工程目录下创建存放中间件目录
2、继承MiddleWareMixin
3、覆写切点方法,实现自我功能
# myMiddleware.py 中
from django.utils.deprecation import MiddlewareMixin
# 配置自定义中间件(继承于MiddlewareMixin),被运行时打印参数列表
class MyappMiddleWare(MiddlewareMixin):
def __init__(self,get_response=None):
print("===============> middleware的__init__已经初始化了 ")
#def process_request(self,request):
#print("===============> process_request 被运行了 ",request)
def process_view(self,request,view_func,view_args,view_kwargs):
print("===============> process_view 被运行了 ",request,view_func,view_args,view_kwargs)
def process_template_response(self,request,response):
print("===============> process_template_response 被运行了 ",request,response)
def process_response(self,request,response):
print("===============> process_response 被运行了 ",request,response)
return response
def process_exception(self,request,exception):
print("===============> process_exception 被运行了 ",request,exception)
4、在settings.py内进行注册
运行结果:
例:黑名单用户访问
1、创建不可访问的页面
2、定义黑名单IP地址
3、定义请求中间键函数
# myMiddleware.py 中
from django.shortcuts import render
from django.utils.deprecation import MiddlewareMixin
from HelloMiddleWare.settings import BLACK_LIST
# 配置自定义中间件(继承于MiddlewareMixin),被运行时打印参数列表
class MyappMiddleWare(MiddlewareMixin):
def __init__(self,get_response=None):
super(MyappMiddleWare,self).__init__()
print("===============> middleware的__init__已经初始化了 ")
def process_request(self,request):
# 获取访问者的META中的IP,并打印
clientIp = request.META['REMOTE_ADDR']
print("===============> process_request 被运行了 ",request,clientIp)
# 返回不可访问的网页给黑名单
if clientIp in BLACK_LIST:
return render(request,'fuckoff.html')
黑名单访问结果: