django中间件

django自带7个中间件,每个中间件都有各自的功能,还支持自定义中间件并且提供5个可以自定义的方法


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # 自定义中间件
    # 'app02.mymiddleware.mymidware.MyWare1',
    # 'app02.mymiddleware.mymidware.JsonMiddleware',
]


process_request(self, request):
'''
1.请求来的时候,需要按照中间件在配置文件中注册的顺序,
从上到下经过每一个中间件里面的process_request方法,
2.如果某个中间件里面没有定义process_request方法,则会跳过这个中间件
3.如果该方法返回了HttpResponse对象,那么请求将不再往后执行,而是直接原路返回
process_request方法就是用来做全局相关的所有限制功能


'''
#response参数是django后端返回给浏览器的内容
process_response(self, request, response):
'''
1.响应走的时候,需要按中间件在照配置文件中注册的顺序,
从下往上经过每一个中间件里面的process_response方法,
2.如果某个中间件里面没有定义process_response方法,则会跳过这个中间件
3.该方法必须返回一个HttpResponse对象,默认返回形参response,也可以自定义返回内容

'''
'''
flask框架也有一个中间件,只要返回了数据就必须经过所有中间件里面的类似于process_response方法
'''
'''
了解
process_view在路由匹配成功之后视图函数执行之前执行,顺序从下往上
process_excepton在视图函数中出现异常的情况下触发,顺序从下往上
'''
    

只要是涉及到全局相关的功能都可以使用中间件方便的完成

全局用户身份校验

全局用户权限校验

全局访问频率校验

如何自定义中间件

  1. 在项目名或者应用名下创建一个任意名称的文件夹

  2. 在该文件夹内创建一个任意名称的py文件

  3. 在该文件内写类,这个类必须继续MiddlewareMixin,然后在这个类里面就可以自定义那5个方法了,用几个定义几个

  4. 将类的路径以字符串的形式注册到配置文件中才能生效

    #注册格式:应用名.文件夹名.py文件名.类名
    'app02.mymiddleware.mymidware.MyWare1'
    
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import json


class MyWare1(MiddlewareMixin):
    def process_request(self, request):
        print('第一个自定义中间件的process_request')

    def process_response(self, request, response):
        print('第一个自定义中间件的process_response')
        return response

    def process_view(self,request,*args,**kwargs):
        print('第一个自定义中间件的process_view')

    def process_exception(self,request,exception):
         print(exception)

'''
这个自定义中间件的作用:前端通过ajax以post方式提交json格式数据时,后端可以直接通过request.data来取键值对数据,不用每次都手动反序列化
'''

class JsonMiddleware(MiddlewareMixin):
    def process_request(self, request):
        try:
            request.data=json.loads(request.body)
        except Exception as e:
            request.data =request.POST