中间件

发布时间 2023-03-23 00:09:28作者: 猿小姜

中间件的介绍

官方定义:中间件就是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量。低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个Django中间件都负责一些特定的功能。

说直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作。中间件的本质就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

# from django.middleware.security import SecurityMiddleware

# django自带七个中间件
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',
]

"""
django中间件是django的门户
1.请求来的时候需要经过中间件才能到达真正的django后端,进而进行路由匹配
2.响应走的时候需要经过中间件才真正离开django后端
"""

 

 

自定义中间件

中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

  • process_request(self,request)

  • process_view(self, request, view_func, view_args, view_kwargs)

  • process_template_response(self,request,response)

  • process_exception(self, request, exception)

  • process_response(self, request, response)

以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

自定义中间件案例

"""
1.在项目名或者应用名下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin)
    然后在这个类里面就可以自定义五个方法了
    (这五个方法并不是全部都需要书写,用几个写几个)
4.需要将类的路径以字符串的形式注册到配置文件中才能生效
"""

 

 

 

 中间件中的五种方法

# pricess_request
1.中间件process_request方法是在执行视图函数之前执行的
2.不同中间件之间传递的request都是同一个对象
3.请求来的时候需要经过每一个中间件里面的process_request方法,顺序是按照配置文件中注册的中间件从上往下的顺序执行
4.如果中间件中没有里面没有定义该方法,则直接跳过执行下一个中间件
5.如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行,而是直接原路返回(校验失败不允许访问),并将HttpResponse返回的值返回给浏览器

# process_response
1.响应走的时候需要经过每一个中间件里面的process_response方法
2.process_response方法有两个额外参数request,response
3.process_response方法必须返回一个HttpResponse对象(没有则报错)
    默认返回的就是response(response是视图函数返回的HttpResponse对象,也就是django后端返回给浏览器的内容)。如果不返回response而返回其他对象,则浏览器不会拿到django后台给它的视图,而是我的中间件中返回的对象
4.执行顺序是按照配置文件中注册的中间件从下往上的顺序执行

# process_view(了解)
    路由匹配成功之后执行视图函数之前,会自动执行中间件里面的process_vies方法
    执行顺序是按照配置文件中注册的中间件从上往下的顺序执行
    
# process_template_response(了解)
    返回的HttpResponse对象有render属性才会触发
    执行顺序是按照配置文件中注册的中间件从下往上的顺序执行
    
# process_exception(了解)
    当视图函数中出现异常触发
    执行顺序是按照配置文件中注册的中间件从下往上的顺序执行
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class MyMiddleware1(MiddlewareMixin):
    def process_request(self,request):
        print('这是第一个自定义中间件里面的process_request方法')
        print(request)
        # return HttpResponse('baby')
    def process_response(self,request,response):
        print('这是第一个自定义中间件里面的process_response方法')
        print(request)
        print(response)
        return response
    def process_view(self,request,view_name,*args,**kwargs):
        print(view_name,args,kwargs)
        print('这是第一个自定义中间件里面的process_view方法')
    def process_template_response(self,request,response):
        print('这是第一个自定义中间件里面的process_template_response方法')
        return response
    def process_exception(self,request,exception):
        print('这是第一个自定义中间件里面的process_ecxeption方法')

        
class MyMiddleware2(MiddlewareMixin):
    def process_request(self,request):
        print(request)
        print('这是第二个自定有中间件里面的process_request方法')
    def process_response(self,request,response):
        print('这是第二个自定义中间件里面的process_response方法')
        # return HttpResponse('自定义中间件中process_response自定义的返回值')
        return response
    def process_view(self,request,view_name,*args,**kwargs):
        print('这是第二个自定义中间件里面的process_view方法')
    def process_template_response(self,request,response):
        print('这是第二个自定义中间件里面的process_template_response方法')
        return response
    def process_exception(self,request,exception):
        print('这是第二个自定义中间件里面的process_exception方法')
View Code
这是第一个自定义中间件里面的process_request方法
<WSGIRequest: GET '/index/'>
<WSGIRequest: GET '/index/'>
这是第二个自定有中间件里面的process_request方法
<function index at 0x0000019686429090> ((), {}) {}
这是第一个自定义中间件里面的process_view方法
这是第二个自定义中间件里面的process_view方法
app01中的index视图
这是第二个自定义中间件里面的process_response方法
这是第一个自定义中间件里面的process_response方法
<WSGIRequest: GET '/index/'>
<HttpResponse status_code=200, "text/html; charset=utf-8">
运行结果