Django自定义中间件实现全链路操作日志记录

 更新时间:2025年07月01日 10:19:46   作者:小王子1024  
在 Django 中,中间件(Middleware)是一组轻量级、底层的插件系统,用于全局地改变 Django 的输入和输出,本文给大家介绍Django自定义中间件实现全链路操作日志记录,感兴趣的朋友跟随小编一起看看吧

一、中间件

介绍

在 Django 中,中间件(Middleware)是一组轻量级、底层的插件系统,用于全局地改变 Django 的输入和输出。中间件可以在请求被处理之前和响应返回之前执行代码,从而实现各种功能,例如跨域资源共享(CORS)、用户认证、日志记录等。

激活中间件

若要激活中间件,需要添加到settings.MIDDLEWARE

  • 每个中间件组件由字符串表示:指向中间件工厂类的完整 Python 路径。
  • 需求注意中间件的添加顺序。因为中间件有执行顺序,而且中间件之间可能有依赖关系。
  • 中间件的全局执行顺序
    • 请求阶段:按settings.MIDDLEWARE从上到下的顺序执行。
    • 视图处理:请求到达视图函数。
    • 响应阶段:按settings.MIDDLEWARE从下到上的顺序执行。
MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",  # CORS跨域支持
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.locale.LocaleMiddleware",  # I18N多语言支持,注意放置顺序
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    # "myapp_system.operate_log.services.OperateLogMiddleware",  # 操作日志开关:如果数据库磁盘IO性能一般,建议关闭
]

生命周期

中间件生命周期

  • 请求阶段:process_request(request):在视图函数被调用之前执行,用于处理请求。如果返回 HttpResponse 对象,则后续的中间件和视图不会被调用,直接返回响应。
  • 视图阶段:process_view(request, view_func, view_args, view_kwargs):在视图函数被调用之前执行,可以用于根据视图函数的参数或请求信息进行额外处理。
  • 响应阶段:process_response(request, response):在视图函数返回响应后执行,用于处理响应对象,可以修改响应内容或响应头。
  • 异常阶段:process_exception(request, exception):当视图函数抛出异常时执行,用于处理异常并返回一个 HttpResponse 对象。

内置中间件示例

  • django.contrib.auth.middleware.AuthenticationMiddleware:Django内置的认证中间件,实现将 user 属性添加到每个传入的 HttpRequest 对象中,表示当前已登录的用户
class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if not hasattr(request, "session"):
            raise ImproperlyConfigured(
                "The Django authentication middleware requires session "
                "middleware to be installed. Edit your MIDDLEWARE setting to "
                "insert "
                "'django.contrib.sessions.middleware.SessionMiddleware' before "
                "'django.contrib.auth.middleware.AuthenticationMiddleware'."
            )
        request.user = SimpleLazyObject(lambda: get_user(request))

二、自定义中间件

中间件钩子函数

process_view()中间件钩子函数

  • 语法:process_view(request, view_func, view_args, view_kwargs)
  • 调用顺序:process_view() 只在 Django 调用视图前被调用。
  • 返回
    • 如果它返回 None ,Django 将继续处理这个请求,执行任何其他的 process_view() ,然后执行相应的视图。
    • 如果它返回 HttpResponse 对象,Django 不会去影响调用相应的视图;它会将响应中间件应用到 HttpResponse 并返回结果。

基于类的中间件

基于类的自定义中间件格式

  • 语句response = self.get_response(request),将__call__()方法中的代码分为两部分
class SimpleMiddleware:
    def __init__(self, get_response):
        # 执行一次性配置和初始化工作
        self.get_response = get_response
    def __call__(self, request):
        # 每个请求调用一次,在视图函数被调用之前执行
        response = self.get_response(request)
        # 每个请求调用一次,在视图函数被调用之后执行
        return response

三、实战案例

操作日志功能

通过自定义中间件,实现Django操作日志记录功能

  • 第1步:定义类OperateLogMiddleware,方法__init__()中,添加exclude_urls排除不需要记录的URL的列表,和一个字典log_data用于临时存放日志信息。

  • 第2步:在执行视图函数之前,向字典log_data记录请求方法、请求路径、操作IP、浏览器Agent信息等

  • 第3步:在执行视图函数之后,向字典log_data记录用户ID、业务状态码、HTTP状态码、响应数据、返回结果和执行时间

  • 第4步:process_view()中间件钩子函数中,向字典log_data记录视图名称、Action名称、资源ID

第5步:字典log_data记录的操作日志信息,通过Celery异步任务,写入数据库。实现操作日志记录功能。

代码运行效果:

查看完整代码:下载地址

参考资料

到此这篇关于Django自定义中间件实现全链路操作日志记录的文章就介绍到这了,更多相关django自定义中间件全链路内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Python脚本开头及导包注释自动添加方法

    浅谈Python脚本开头及导包注释自动添加方法

    今天小编就为大家分享一篇浅谈Python脚本开头及导包注释自动添加方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 用python实现简单EXCEL数据统计的实例

    用python实现简单EXCEL数据统计的实例

    下面小编就为大家带来一篇用python实现简单EXCEL数据统计的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Django 项目配置拆分独立的实现

    Django 项目配置拆分独立的实现

    Django 项目中,我们默认的配置是都在 settings.py 文件里面的,但是实际本地调试和线上应该是需要两个环境的,我们现在来拆分下配置,本文就详细的来介绍一下
    2021-11-11
  • Selenium+Python自动化测试入门

    Selenium+Python自动化测试入门

    本文主要介绍了Selenium+Python自动化测试入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python的paramiko模块基本用法详解

    python的paramiko模块基本用法详解

    paramiko 是一个用于在Python中执行远程操作的模块,支持SSH协议,它可以用于连接到远程服务器,执行命令、上传和下载文件,以及在远程服务器上执行各种操作,这篇文章主要介绍了python的paramiko模块基本用法,需要的朋友可以参考下
    2023-08-08
  • Python3中的bytes和str类型详解

    Python3中的bytes和str类型详解

    这篇文章主要介绍了Python3中的bytes和str类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Windows平台Python连接sqlite3数据库的方法分析

    Windows平台Python连接sqlite3数据库的方法分析

    这篇文章主要介绍了Windows平台Python连接sqlite3数据库的方法,结合实例形式分析了Windows平台安装SQLite数据库及创建、连接数据库的实现方法与相关注意事项,需要的朋友可以参考下
    2017-07-07
  • 在vscode中配置python环境过程解析

    在vscode中配置python环境过程解析

    这篇文章主要介绍了在vscode中配置python环境过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 替换python字典中的key值方法

    替换python字典中的key值方法

    今天小编就为大家分享一篇替换python字典中的key值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python中的CSV文件使用

    Python中的CSV文件使用"with"语句的方式详解

    with语句的主要用法是对语句中使用的对象进行异常安全的清除.确保文件已关闭,锁定已释放,上下文恢复等.本文通过实例代码给大家介绍Python中的CSV文件使用"with"语句的相关知识,感兴趣的朋友一起看看吧
    2018-10-10

最新评论