当前位置: 首页 > news >正文

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_responsedef __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 中间件

您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

http://www.lryc.cn/news/575990.html

相关文章:

  • IPv6配置
  • MySQL主从备份
  • 16.2 Docker多阶段构建实战:LanguageMentor镜像瘦身40%,支持500+并发1.2秒响应!
  • 2025年智能营销产品发展和应用趋势
  • uniapp消息推送
  • 向量关于基的坐标向量
  • 图像分割模型中的空间信息、上下文信息、空间路径、上下文路径到底是什么?有什么作用?
  • 【C++】atoi和std::stoi
  • redisTemplate简单实现幂等性校验
  • 微信小程序进度条progress支持渐变色
  • 【vue3】打包配置webpack压缩,哈希值设置
  • CVE-2015-5531源码分析与漏洞复现(Elasticsearch目录遍历漏洞)
  • 高斯混合模型GMMK均值(十三-1)——K均值是高斯混合模型的特例
  • macOS,切换 space 失效,向右切换space(move right a space) 失效
  • [论文阅读] 人工智能 | 真实场景下 RAG 系统的工程实践指南
  • JUC:7线程的五种状态与六种状态
  • AI歌手Yuri出道:GenAI,透露着新的AI产业机遇?
  • 增加寒武纪MLU270视频转码
  • 大数据赋能智能家居:打造你贴心的“数字管家”
  • STM32安全固件升级:使用自定义 bootloader 实现SD卡固件升级,包含固件加密
  • 【stm32】HAL库开发——CubeMX配置串口通讯(中断方式)
  • virtual box 配置ubuntu 22.04网络与SSH服务
  • A模块 系统与网络安全 第三门课 网络通信原理-2
  • 24CJ87-4:圆拱型采光排烟天窗
  • Pytorch基础函数速查
  • A Machine Learning Approach for Non-blind Image Deconvolution论文阅读
  • AI助力基因数据分析:用Python玩转生命密码的秘密
  • 高标准+安全可控:关键领域研发选择什么软件?
  • QT编译wasm报错:The program “mingw32-make.exe“ does not exist or is not executable
  • 《二分枚举答案(配合数据结构)》题集