自定义中间件

发布时间 2023-12-20 18:50:31作者: 朱饱饱

自定义中间件

自定义步骤:
-写一个类,继承MiddlewareMixin
-里面写方法process_request(请求来了,一定会触发它的执行)
-在setting中配置(注意,放在前和放在后)
MIDDLEWARE = [
...
'app01.mymiddle.MyMiddleware1',
...
]

 

 

 

1 process_request(request对象)
2 process_response(request对象,response对象)
3 多个中间件,执行顺序是什么?
-请求来的时候从上往下执行:process_request
-请求走的时候,从下往上执行:process_response


4 process_request可以干什么?
-写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
-频率限制(限制某个ip地址,一分钟只能访问5次)
-登录认证(只要没登录,重定向到login路径)、
-记录用户访问日志(ip,时间,访问路径)

5 process_response可以干什么?内部有response对象
-统一给所有(某几个路径)加cookie
-统一给所有(某几个路径)加响应头



6 process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数)
def process_view(self, request, callback, callback_args, callback_kwargs):
# print(callback)
# print(callback_args)
# print(callback_kwargs)
#
res=callback(request)
#
print("中间件1的process_view")
return res
7 process_exception 视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)
# 全局异常捕获,返回4开头的
def process_exception(self, request, exception):
print(exception)
return render(request,'error.html')

 

 

from django.utils.deprecation import MiddlewareMixin
# process_request
# process_response
from django.shortcuts import render,HttpResponse

# process_view
class MyMiddleware1(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了1')
        # print(request.session)
        # 可不可以返回?必须返回HttpResponse的对象
        # return HttpResponse('我不让你访问')

    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了1')
        return response

    # 路由匹配成功,视图函数执行之前执行
    def process_view(self, request, callback, callback_args, callback_kwargs):
        # print(callback)
        # print(callback_args)
        # print(callback_kwargs)
        #
        # res=callback(request)
        #
        print("中间件1的process_view")
        # return res


class MyMiddleware2(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了2')
        # print(request.session)
        # 可不可以返回?
        # return HttpResponse('dsb')

    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了2')
        return response

    # 全局异常捕获,返回4开头的
    def process_exception(self, request, exception):
        print(exception)
        print('exception')
        return render(request,'error.html')