Django 中间件

Django 中间件操作

  • 参考文献:``

1.配置文件

  • 配置文件中间件的相关设置
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',#csrf的中间件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CSRF也是一个相关的中间件

当自定义的中间件逻辑设计好之后需要将相关的路径添加至配置文件

2.Django的请求流程

image-20210330093822664

2.1 中间件的文件

配置文件中的中间件表示的是对应的文件,自己也可一定义相关的中间件,之后进行注册,即在配置文件最后加上自己定义的中间件,特殊情况可以放在第一行或其他位置,注意一般不要打乱原始位置中间件是从上到下依次执行,返回的时候是从下到上依次返回。

中间件一般放在utils文件夹之中,可以在项目的根目录下面创建;也可以在应用(APP)的文件里面创建通常叫middleware,之后再将相关的路径配置到相关的配置文件

3.自定义中间件

3.1 概述

  • 每个中间件的类都必须继承 MiddlewareMixin 路径是from django.utils.deprecation import MiddlewareMixin

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

    • process_request(self,request) 请求中间件

    • process_response(self, request, response) 响应中间件

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

    • process_template_response(self,request,response)

    • process_exception(self, request, exception)

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

  • 当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时 process_request, 最后到达 views 的函数中,views 函数处理后,在依次穿过中间件,这个时候是 process_response ,最后返回给请求者。

image-20210330094023600

from django.utils.deprecation import MiddlewareMixin

class M1(MiddlewareMixin):

    def process_request(self,request):
        print('请求来了')
    def process_response(self,request,response):
        # 参数必须都有,且两者顺序不能乱,最终要返回response
        print('响应来了')
        # 查看相应对象的内容
        
        print(response.__dict__['_container'][0].decode('utf-8'))
        return response
response.__dict__['_container'][0].decode('utf-8')
# 查看对象的详细信息,取出并转码

3.2 常见方法介绍

1. process_request()方法。
  • 只有一个参数request

  • 可以无返回值,也可以设置返回值

  • 是否登录示例
    from django.shortcuts import redirect
    from django.utils.deprecation import MiddlewareMixin
    from django.conf import settings
    
    from web import models
    
    
    class AuthMiddleware(MiddlewareMixin):
    
        def proccess_request(self,request):
            '''如果用户已登录,则request赋值'''
            user_name=request.session.get('user_name',0)
            userobj=models.UserInfo.objects.filter(user_name=user_name)
            request.tracer.user=userobj
    
            '''
            使用对应的白名单进行操作;设置在Settings的配置文件中。可以根据需要进行设置使用
            '''
    
            if request.path_info in settings.WHITE_REGEX_URL_LIST:
                return
            # 不存在,则直接返回登录界面
            if not request.tracer.user:
                return redirect('login')
    
2. process_response方法。

该方法必须有返回值!,一般都会返回response

  • 两个参数requestresponse

  • 示例
    # -*- coding: utf-8 -*-
    '''
    @Time    : 2022/1/4 15:59
    @Author  : ziqingbaojian
    @File    : auth.py
    '''
    from django.utils.deprecation import MiddlewareMixin
    
    class MiddlewareTest(MiddlewareMixin):
        def process_request(self,request):
            print("auth.m1.request")
        def process_response(self,request,response):
            print("auth.m2.response")
            return response#改方法必须要有返回值
        def process_view(self, request, view_func, view_args, view_kwargs):
            print("auth.m3.view_mid")
    class MiddlewareTest2(MiddlewareMixin):
        def process_request(self,request):
            print("auth.v1.request")
        def process_response(self,request,response):
            print("auth.v2.response")
            return response#改方法必须要有返回值
        def process_view(self, request, view_func, view_args, view_kwargs):
            print("auth.v3.view_mid")
    

    image-20220104165155439

3.其他方法
  • process_exception
    • 两个参数(request ,exception),视图函数出现异常事执行。

    • image-20220104170602239

  • 示例
    def index(request):
        print("现在是视图函数在执行!!")
        int('asdf')
        return HttpResponse("....")
    
    class MiddlewareTest2(MiddlewareMixin):
        def process_request(self,request):
            print("auth.v1.request")
    
        def process_response(self,request,response):
            print("auth.v2.response")
            return response#改方法必须要有返回值
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print("auth.v3.view_mid")
    
        def process_exception(self,request,exception):
            print('auth.v4.exception')
            return HttpResponse("错误了!")
    
    

    image-20220104172341132

    • 注意当使用process_view可能不会影响异常处理的流程,无法执行。
    • 前面异常处理掉将不在执行后面的异常处理函数。
  • process_view
    • process_view(self, request, view_func, view_args, view_kwargs)
      
      view_func #请求对应的视图函数
      #对应的返回值
      
      return view_func(request,*view_args,**view_kwargs)#直接返回执行对应的视图函数,但是不在执行后面的视图函数 
      
    • image-20220104170046354

  • process_template_response
    • 两个参数:request,response

    • 示例
       def process_template_response(self,request,response):
              """
              视图中包含render返回值是改函数才会被执行。~
              :param request:
              :param response:
              :return:
              """
              return response
      
    • image-20220104173641429

4.示例
  • # -*- coding: utf-8 -*-
    '''
    @Time    : 2022/1/4 15:59
    @Author  : ziqingbaojian
    @File    : auth.py
    '''
    from django.utils.deprecation import MiddlewareMixin
    
    class MiddlewareTest(MiddlewareMixin):
        def process_request(self,request):
            print("auth.m1.request")
    
        def process_response(self,request,response):
            print("auth.m2.response")
            return response#改方法必须要有返回值
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            pass
    
  • image-20220104164215937

3.3 用途

  • 一般用于登录验证。
    • 通过登录成功之后为用户赋值session中的键值对,判断用户是否登录如果用户为登录,则不返回相关的界面。
  • 日志记录
    • 同过中间件会将所有的请求进行记录,因此需要日志操作的时候后可以进行专门的日志定制。
  • 缓存
    • 缓存:另一台电脑中内存里的内容
    • 对所有请求或一部分请求做批处理

4.知识梳理

  • image-20220104174201119

继续努力,终成大器!

原文地址:https://www.cnblogs.com/Blogwj123/p/15763406.html