Django的中间件

Django的中间件

【一】重点:

django中间件是django的门户

  • 请求来的时候需要经过中间件才能到达真正的django后端
  • 响应走的时候也需要经过中间件才能发送出去
  • 中间件按照顺序依次执行

​ Django 中间件(Middleware)是 Django 框架提供的一种机制,用于在请求和响应处理过程中进行预处理和后处理操作。中间件可以对请求进行修改、验证、日志记录等操作,也可以对响应进行修改、处理异常等操作。

​ Django 中间件的主要作用是将请求和响应传递给下一个中间件或视图函数,并在传递过程中执行特定的逻辑。中间件可以在请求到达视图函数之前预处理请求,也可以在视图函数返回响应之后对响应进行后处理。

【二】常见用途:

  1. 认证和授权:中间件可以用于验证用户身份、检查权限和权限控制。
  2. 请求处理:中间件可以对请求进行预处理,如请求参数解析、请求数据验证等。
  3. 日志记录:中间件可以记录请求和响应的日志,用于调试和监控。
  4. 缓存:中间件可以实现请求的缓存,提高性能。
  5. 异常处理:中间件可以捕获和处理异常,例如记录异常日志或返回自定义错误页面。
  6. 响应处理:中间件可以在视图函数返回响应之后对响应进行修改或添加额外的信息。

【三】常见的方法

​ 在 Django 中,中间件是通过一个类来实现的,类中定义了一系列方法,每个方法代表一个中间件处理的阶段。常见的中间件方法包括:

​ 重点掌握

  • process_request(request): 在请求到达视图函数之前调用。(进)

    • 请求来的时候需要经过每一个中间件里面的process_request方法结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行。
    • 如果中间件里面没有定义该方法,那么直接跳过执行下一个中间件。
    • 如果该方法返回了HttpResponse对象,那么请求将不在继续往后执行。而是直接原路返回(校验失败不允许访问…)就是截胡。

    process_request方法就是用来做全局相关的所有限制功能。

  • process_response(request, response): 在视图函数返回响应之后调用。(出)

    • 响应走的时候需要结果每一个中间件里面的process_response方法。该方法有两个额外的参数request,response

    • 该方法必须返回一个HttpResponse对象。

      • 默认返回的就是形参response
      • 你也可以自己返回自己的
    • 顺序是按照配置文件中注册了的中间件。从下往上依次经过,如果你没有定义的话直接跳过执行下一个。

​ 如果在第一个process_request方法就已经返回了HttpResponse对象,那么想要走的时候是经过所有的中间件里面的process_response还是有其他情况。

答案是其他情况:

  • 就是会直接走同级别的process_response返回
  • image-20240312230536930

​ 了解即可

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

    • 在路由匹配之后执行视图函数之前。 会自动执行中间件里面该方法
    • 顺序是按照配置文件中注册的中间件从上午往下的顺序依次执行。
  • process_template_response(request, request, response):在模板响应对象生成后的处理逻辑。可以修改模板上下文或响应内容。

  • process_exception(request, exception): 在视图函数抛出异常时调用。

​ 您可以在 Django 项目的配置文件 settings.py 中的 MIDDLEWARE 设置中指定中间件的顺序。中间件按照顺序依次执行,前一个中间件的输出将作为下一个中间件的输入。

以下是一个示例的 settings.py 中间件设置的部分:

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 默认的中间件设置,包括了一些常用的中间件,如安全中间件、会话中间件、CSRF 中间件等。

​ 您也可以编写自定义的中间件来满足特定的需求。编写自定义中间件的步骤包括创建一个类,实现中间件方法,并将其添加到 MIDDLEWARE 设置中。

【四】Django中间件的模板

要使用 Django 中间件,您需要按照以下步骤进行操作:

  1. 在项目名给或者应用名下创建一个任意名称的文件夹
  2. 在该文件夹创建一个任意名称py文件
  3. 在该py文件内需要书写类(这个类必须继承MiddlewareMixin
  4. 需要将类的路径以及字符串的形式注册到配置文件中才能生效
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',
    '你自己写的中间件的路径1'
    '你自己写的中间件的路径2'
    '你自己写的中间件的路径3'
]
  • 在注册自己的中间件(在应用下创建路径有提示,但是如果在项目下创建就没有提示了,你就需要自己比对书写了)
class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def process_request(self, request):
        # 在请求到达视图函数之前的处理逻辑
        pass

    def process_view(self, request, view_func, view_args, view_kwargs):
        # 在视图函数被调用之前的处理逻辑
        pass

    def process_exception(self, request, exception):
        # 在视图函数抛出异常时的处理逻辑
        pass

    def process_template_response(self, request, response):
        # 在模板响应对象生成后的处理逻辑
        # 可以修改模板上下文或响应内容
        return response

    def process_response(self, request, response):
        # 在视图函数返回响应之后的处理逻辑
        # 可以修改响应或添加额外的信息
        return response

  1. 配置中间件:在 Django 项目的配置文件 settings.py 中,找到 MIDDLEWARE 设置。将您的中间件类添加到列表中,并指定其顺序。中间件按照列表中的顺序依次执行。
MIDDLEWARE = [
    # 其他默认中间件...
    'myapp.middleware.MyMiddleware',
]

请确保将 'myapp.middleware.MyMiddleware' 替换为您自己的中间件类的完整路径。

  1. 处理请求和响应:当您的 Django 项目接收到请求时,中间件将按照顺序依次处理请求和响应。每个中间件方法将根据其定义和需求执行相应的操作。您可以在中间件方法中修改请求和响应对象,添加额外的信息,进行验证,记录日志等。

​ 需要注意的是,中间件方法的参数可能会有所不同。例如,process_request 方法只接收一个 request 参数,而 process_view 方法接收 requestview_funcview_argsview_kwargs 参数。请根据您的需求和中间件方法的定义来确定您需要使用的参数。

方法的参数可能会有所不同。例如,process_request 方法只接收一个 request 参数,而 process_view 方法接收 requestview_funcview_argsview_kwargs 参数。请根据您的需求和中间件方法的定义来确定您需要使用的参数。

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值