一, 中间件
1, 中间件是什么?
中间件顾名思义, 是介于 request 与 response 处理之间的一道处理过程, 相对比较轻量级, 并且在全局上改变 django 的输入与输出. 因为改变的是全局, 所以需要谨慎实用, 用不好会影响到性能.
2, 做过什么?
用户登录
日志记录
crsf: 对所有的 post 请求做了一个验证
session
权限管理
3,
注意:
对于所有请求的批量做处理的时候用中间件
单独对某几个函数做处理的时候用装饰器
4, 使用步骤:
步骤:
1,, 先建一个文件夹, 里面写一个 py 文件
2,, 然后开始写类
1. 中间件就是一个类, 类里面写几个方法
class M1(MiddlewareMixin): 必须继承
def process_request(self,request): request: 请求里面的所有的东西
print("m1.request_request")
这个方法里面别轻易返回值, 要是有返回值就不再继续执行后面的了, 执行自己的 process_response 和上边的 response
一般是无返回值的: 继续执行后续的中间件和视图函数
- def process_response(self,request,response):
- return response
2. 在 settings 中的 MIDDLEWARE 加上路径
文件夹名称. py 文件名称. 类名
3. 找到继承的那个类, 吧那个类拿过来
一般不要用导入的方法, 不然有时候更新了就没有这个类了, 你就把它继承的那个类拿过来,
图示分析过程:
process_reques 有返回值:
process_reques 无返回值:
在中间件中设置:
示例:
- class MiddlewareMixin(object):
- def __init__(self, get_response=None):
- self.get_response = get_response
- super(MiddlewareMixin, self).__init__()
- def __call__(self, request):
- response = None
- if hasattr(self, 'process_request'):
- response = self.process_request(request)
- if not response:
- response = self.get_response(request)
- if hasattr(self, 'process_response'):
- response = self.process_response(request, response)
- return response
- # 至少要有两个类
- class Md1(MiddlewareMixin): #必须继承
- def process_request(self,request):
- print("md1===process_request")
- l = ["/login/"]
- #request.path_info: 当前的路径
- if request.path_info in l: #因为 login 不做验证, 就直接返回 none 就行了
- return None
- if not request.session.get(settings.GDP):
- return redirect("/login/")
- #
- # 如果无返回值, 就继续执行后续中间件和视图函数
- # 如果有返回值, 就执行自己的 process_response 和上面的 response
- def process_response(self,request,response):
- print("md1====process_response1")
- return response #必须有返回值
- class Md2(MiddlewareMixin):
- def process_request(self,request):
- print("md2====process_request2")
- def process_response(self,request,response):
- print("md2====process_response2")
- return response
测试:
- def testMD(request):
- print("view.test")
- return HttpResponse("...")
返回结果:
来源: http://www.bubuko.com/infodetail-3086323.html