本文介绍: 引入父类print(“这是第一个自定义中间件中的 process_request 方法“)print(“这是第二个自定义中间件中的 process_request 方法“)请求来的时候需要经过每一个中间件process_request 方法结果顺序是按照配置文件注册中间件从上往下的顺序执行的如果没有定义这个方法,就跳过这个中间件如果在自定义中间件中定义返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)

目录

一.介绍

1.什么是Django中间件

2.作用:

3.示例

二.Django请求生命周期流程图

三.Django中间件是Django的门户

四.中间件方法

1.必须掌握的中间件方法

(1)process_request:

示例:

2.需要了解的中间件方法

(1)process_view

示例:

(2)process_template_response

示例:

(3)process_exception

示例:

五.自定义中间件

1.process_request

1.路由层

2.视图层

3.配置文件

4.自定义中间件

5.总结

(1)执行顺序

(2)没有定义process_request

(3)定义了返回值

(4)总结

2.process_response

3.小结


一.介绍

1.什么是Django中间件

2.作用:

3.示例

class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在视图函数调用之前的预处理逻辑
        # ...

        response = self.get_response(request)

        # 在响应返回客户端之前的后处理逻辑
        # ...

        return response

二.Django请求生命周期流程图

  1. 客户端发出HTTP请求
  2. 请求被Web服务器接收并传递给Django应用程序
  3. Django中的WSGI中间件开始处理请求,并可进行一些预处理操作
  4. 中间件将请求传递给URL分发器(URL Dispatcher)
  5. URL分发器根据URL模式将请求路由到相应的视图函数处理器(View/Handler)
  6. 视图函数或处理器执行相应的业务逻辑,可能会与数据库等外部资源交互
  7. 视图函数或处理器返回一个HTTP响应对象
  8. 响应对象经过中间件,可以在此进行后处理操作
  9. 响应被发送给Web服务器
  10. Web服务器将响应发送回客户端

三.Django中间件是Django的门户

四.中间件方法

Django支持程序员自定义中间件并且给程序员5个中间件

1.必须掌握的中间件方法

(1)process_request:

  1. 执行顺序
            请求来的时候需要经过每一个中间件的process_request方法
            结果顺序是按照配置文件注册的中间件从上往下的顺序执行的
  2. 没有定义process_request
            如果没有定义这个方法就跳过这个中间件
  3. 定义了返回值
            如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问
  4. 总结
            process_request方法就是用来全局相关的所有限制功能

示例:

class CustomResponseMiddleware:
    def process_response(self, request, response):
        # 在这里对响应进行处理
        response['X-Custom-Header'] = 'Custom Value'
        return response

2.需要了解的中间件方法

(1)process_view

  1. 路由匹配成功后执行视图函数之前
  2. 自动执行中间件里面的该方法
  3. 顺序是按照配置文件注册的中间件从上而下的顺序执行
  • 该方法在请求到达视图之前被调用,在视图函数执行前执行。
  • 接收一个HttpRequest对象和一个视图函数作为参数,并且可以返回一个HttpResponse对象或None。

示例:

class LoggingMiddleware:
    def process_view(self, request, view_func, view_args, view_kwargs):
        # 在这里记录日志
        logger.info(f"Request received: {request.path}")
        # 返回None,继续执行原视图函数
        return None

(2)process_template_response

  1. 返回的 HttpResponse 对象有 render 属性的时候才会触发

  2. 顺序是按照配置文件注册了的中间件从下往上依次经过

示例:

class GlobalContextMiddleware:
    def process_template_response(self, request, response):
        # 在这里添加全局的上下文数据
        response.context_data['global_data'] = "Global Value"
        return response

(3)process_exception

  1. 当视图函数中出现异常的情况下触发
  2. 顺序是按照配置文件注册了的中间件从下往上依次经过
  • 该方法在视图函数抛出异常时被调用。
  • 接收一个HttpRequest对象和一个异常对象作为参数,可以返回一个HttpResponse对象来替代原始的异常响应。

示例:

class ErrorHandlerMiddleware:
    def process_exception(self, request, exception):
        # 在这里处理异常
        if isinstance(exception, CustomException):
            # 如果自定义异常,返回一个定制错误页面
            return render(request, 'error.html', {'error': str(exception)})
        else:
            # 默认情况,返回一个500服务错误
            return HttpResponseServerError("Internal Server Error")

五.自定义中间件

1.process_request

1.路由层

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
]

2.视图层

def index(request):
    print("这是视图函数index")
    return HttpResponse("index 的返回值")

3.配置文件

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',
    # 注册自己的中间件(在应用创建路径会有提示,但是如果在项目创建没有提示需要自己根据路径书写)
    'app01.mymiddle.my_middle.MyMiddle',
    # 谁先注册就先执行谁
    'app01.mymiddle.my_middle.MyMiddle2',
]

4.自定义中间件

# -*-coding: Utf-8 -*-
# @File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/17

# 引入父类
from django.utils.deprecation import MiddlewareMixin


class MyMiddle(MiddlewareMixin):
    def process_request(self, request):
        print("这是第一个自定义中间件中的 process_request 方法")

class MyMiddle2(MiddlewareMixin):
    def process_request(self, request):
        print("这是第二个自定义中间件中的 process_request 方法")

5.总结

(1)执行顺序
  • 请求来的时候需要经过每一个中间件的 process_request 方法
  • 结果的顺序是按照配置文件注册的中间件从上往下的顺序执行的
(2)没有定义process_request
  • 如果没有定义这个方法,就跳过这个中间件
(3)定义了返回值
  • 如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
(4)总结

2.process_response

# 引入父类
from django.utils.deprecation import MiddlewareMixin


class MyMiddle(MiddlewareMixin):
    def process_request(self, request):
        print("这是第一个自定义中间件中的 process_request 方法")

    def process_response(self, request, response):
        '''
        
        :param request: 
        :param response: 就是Django返回给浏览器内容
        :return: 
        '''
        print("这是第一个自定义中间件中的 process_response 方法")
        # 必须返回 responser
        return response
  • 响应被返回的时候需要结束每一个中间件里面的 process_response 方法

  • 该方法必须返回 HttpResponse 对象

  • 顺序是按照配置文件中注册过的中间件从下往上依次经过

    • 如果没有定义,则跳过,校验下一个

3.小结

  • 如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?

    • 会直接走同级别的 process_response 方法 ,然后直接返回
  • flask框架的中间件也有一个类似的方法

    • 但是flask返回数据就必须经过所有中间件里面的 process_response 方法

原文地址:https://blog.csdn.net/qq_65852978/article/details/134584112

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_10473.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注