首页 > 其他分享 >django 自定义中间件

django 自定义中间件

时间:2024-09-05 16:14:15浏览次数:13  
标签:自定义 process 中间件 self request 视图 django response view

概述

中间件是 Django 请求/响应处理的框架,用于全局改变 Django 的请求输入或响应输出。在请求阶段,在调用视图之前,Django 按照定义settings.MIDDLEWARE的顺序应用中间件 MIDDLEWARE,自顶向下。

中间件的结构:

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return respons

  • __init__方法在服务器启动时被调用,用于中间件的初始化。
  • __call__方法在每次请求时被调用,可以在此处添加自定义逻辑

示例1:

1、第一步:自定义日志中间件,在myapp文件下创建一个middleware.py文件,在文件内定义LoggingMiddleware 中间件类

# 对Request请求与视图响应返回做日志记录
# myapp.middleware.LoggingMiddleware

import logging

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

    def __call__(self, request):
        logging.info(f'Request: {request.method} {request.path}')
        response = self.get_response(request)
        logging.info(f'Response: {response.status_code}')
        return response

2、在settings.py中注册中间件,即可。

MIDDLEWARE = [
    # ...
    'myapp.middleware.LoggingMiddleware',
    # ...
]

process_request(self, request)

1、process_view() 只在 Django 执行url前被调用。

2、例举场景:在process_request()中我们可以定义合适的 限流或权限啥的

process_view(self, request, view_func, view_func_args, view_func_kwargs)

1、process_view() 只在 Django 调用视图前被调用。

2、它只能返回 None 或 HttpResponse 对象。如果它返回 None,Django 将继续处理这个请求,执行任何其他的 process_view() ,然后执行相应的视图(request里的url指向的视图)。如果返回 HttpResponse 对象,Django不会去影响调用相应的视图;它会将响应中间件应用到 HttpResponse 并返回结果。

3、例举场景:在process_view()中我们可以定义合适的 权限验证啥的

process_exception(self, request, exception)

1、在视图执行期间,出现异常而被抛出时,就会执行该方法。

2、当视图引发异常时,Django 会调用 process_exception()process_exception() 应该返回 None 或 HttpResponse 对象。如果它返回一个 HttpResponse 对象,模板响应和响应中间件将被应用且会将结果响应返回浏览器。否则,就会开始默认异常处理

3、例举场景:process_exception()可以用来定义规范异常的错误输出和响应请求

process_response(self, request, response)

1、所有的响应返回给浏览器之前被调用,返回HttpResponse,一定会走这个逻辑,即使view里面代码错了,先走错的process_exception(),再走这个

2、例举场景:用于规范响应输出格式啥的

process_template_response(self, request, response)

1、request 是一个 HttpRequest 对象。response 是 TemplateResponse 对象(或者等效对象),它通过 Django 视图或中间件返回。

2、process_template_response() 在视图被完全执行后调用,且视图返回的是 render() 方法,是一个 TemplateResponse 或等效对象 就会执行到该方法。(因此该方法并不常用)

==============

示例2:

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

class SimpleMiddleware(MiddlewareMixin):

    def process_request(self, request):
        # 执行路由之前被调用,返回None就是通过,返回HttpResponse  就是拦截成功

        print("收到请求,但还没执行 url 路由")
        return None

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        # 调用视图函数之前被调用,返回None就是通过,返回HttpResponse  就是拦截成功

        print("以运行了url指向, 但还没开始执行视图")
        return None

    def process_exception(self, request, exception):
        # 视图里面出错了,就会自动到这个里面执行,返回HttpResponse
        # 抓异常,发日志/邮件
        print("视图执行出错了")
        return None

    def process_response(self, request, response):
        # 所有的响应返回给浏览器之前被调用,返回HttpResponse
        # 一定会走这个逻辑,即使view里面代码错了,先走错的,再走这个
        print("视图执行出错了")
        return None

    # def process_template_response(self, request, response):
    #    # 很少用
    #    # 只有我们的视图里面返回了render渲染的,才会走这个
    #     print("视图返回了render函数")
    #     return None

标签:自定义,process,中间件,self,request,视图,django,response,view
From: https://www.cnblogs.com/lanjianhua/p/18398722

相关文章

  • Gin使用zap替换默认的两个日志中间件
    packagemainimport( "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" "net" "net/http"......
  • 在模板中使用 Django 会话
    在Django中使用会话(session)可以让你在用户访问网站的过程中存储和访问临时数据。我们可以利用会话在速度计算器的例子中存储和显示上次计算的结果。1、问题背景在Django中,可以使用会话来存储用户数据。在某些情况下,我们需要在模板中使用会话数据。但是,在某些情况下,我们无法直接......
  • 讲一下Android Lint工具使用,以及如何自定义lint规则
    Androidlint是一个静态代码分析工具,用于在Android项目中检测潜在的问题和错误。它可以帮助开发者提高代码质量、发现性能问题、确保兼容性以及遵循最佳实践。一、Androidlint的主要功能包括:代码风格检查:确保代码遵循一致的风格规范,如命名约定、缩进等。潜在错误检测:识......
  • 计算机毕业设计django+vue超市商品管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和电子商务的普及,传统超市行业正面临着前所未有的变革与挑战。传统的商品管理模式依赖于大量的人工操作和纸质记录......
  • Django+Vue协同过滤算法图书推荐系统的设计与实现
    目录1项目介绍2项目截图3核心代码3.1需要的环境3.2Django接口层3.3实体类3.4config.ini3.5启动类3.5Vue4数据库表设计5文档参考6计算机毕设选题推荐7源码获取1项目介绍博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+粉丝,超300w......
  • Django+Vue家居全屋定制系统的设计与实现
    目录1项目介绍2项目截图3核心代码3.1需要的环境3.2Django接口层3.3实体类3.4config.ini3.5启动类3.5Vue4数据库表设计5文档参考6计算机毕设选题推荐7源码获取1项目介绍博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+粉丝,超300w......
  • Goolge earth studio 高阶3——自定义缓动曲线
    EarthStudio还提供了更高级的选项,比如“自定义”缓动曲线。自定义曲线允许你手动调整曲线,以获得所需的确切时间和流畅度。1、单击我们还要修改的属性,就能在时间框中看到一个表示变化速度的图形编辑器,黄色曲线就是随时间变化的设置值。黄色曲线上的圆圈为关键帧的值,可以拖动......
  • Django中celery的使用(非常简单的用法)
    1、https://www.cnblogs.com/hard-working-Bert/p/14236125.html这里主要展示一个最简单的django中的celery任务,为了让大家都可以用上celery。话不多说,首先给大家看一下我的目录  这里的TestCelery是我的项目名称,CeleryTask是app名称。 windows启动redis服务及修改配置文......
  • 自定义界面布局的行预约小程序源码系统 适合各行各业的 带完整的安装代码包以及搭建部
    系统概述随着移动互联网的普及,小程序以其无需下载、即用即走的特点,成为了用户获取服务的新宠。行预约小程序,作为小程序领域的一个细分应用,旨在为用户提供便捷、高效的预约服务体验。然而,传统的小程序开发往往受限于固定的模板和复杂的开发流程,难以满足各行业差异化的需求。因......
  • Egg.js配置登录验证中间件jwt
    Egg.js配置登录验证中间件一、安装jwtnpminstallegg-jwt二、安装完成后在config--》plugin.js文件中开启jwt插件"usestrict";module.exports={jwt:{enable:true,package:"egg-jwt",},}三、在app文件夹下创建middleware文件夹,创建verif......