Django Auditlog 中间件配置失效的解决方案

发布时间 - 2026-01-29 00:00:00    点击率:

django 使用 django-auditlog 时,若 `auditlogmiddleware` 位置不当(如位于 `sessionmiddleware` 或 `authenticationmiddleware` 之前),将无法正确捕获当前登录用户作为 actor_id,导致审计日志中 actor 字段为空。本文详解中间件正确顺序及配置要点。

在 Django 中,auditlog.middleware.AuditlogMiddleware 的核心职责是:在请求处理过程中自动提取当前已认证用户的 request.user,并将其 ID 绑定到后续模型变更的审计日志中(即 actor_id)。但该中间件高度依赖前置中间件提供的上下文——尤其是 SessionMiddleware(管理会话状态)和 AuthenticationMiddleware(将 request.user 注入请求对象)。若 AuditlogMiddleware 被置于它们之前,request.user 尚未被设置,自然无法获取 actor 信息。

因此,正确的中间件顺序必

须满足以下依赖链:

  • SessionMiddleware → 提供会话支持;
  • AuthenticationMiddleware → 基于会话识别用户,设置 request.user;
  • AuditlogMiddleware → 必须紧随其后(或至少在其之后),才能读取有效的 request.user;
  • 其他中间件(如 CommonMiddleware、CsrfViewMiddleware 等)可按需安排,但不得破坏上述依赖。

你当前的配置中,AuditlogMiddleware 位于 SessionMiddleware 之后、AuthenticationMiddleware 之前,这是关键错误

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'auditlog.middleware.AuditlogMiddleware',  # ❌ 错误:此时 request.user 还未被设置!
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'corsheaders.middleware.CorsMiddleware',     # ⚠️ 注意:CORS 中间件也应置于 CommonMiddleware 之前
    'django.contrib.auth.middleware.AuthenticationMiddleware',  # ✅ 此处才设置 request.user
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

修正后的推荐顺序如下(已标注关键依赖)

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',  # ✅ CORS 必须在 CommonMiddleware 之前(官方要求)
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',  # ✅ 设置 request.user
    'auditlog.middleware.AuditlogMiddleware',                    # ✅ 紧随其后,确保可读取 user
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

? 注意事项

  • AuditlogMiddleware 不可放在 AuthenticationMiddleware 之前,否则 request.user 为 AnonymousUser 或 None,actor_id 将写入 None;
  • 若使用 django-cors-headers,其 CorsMiddleware 必须位于 CommonMiddleware 之前(见 官方文档),否则跨域头可能不生效;
  • 确保用户已登录(即 request.user.is_authenticated 为 True),未登录用户的 actor_id 默认为 None(可通过 AUDITLOG_DISABLE_ON_ANONYMOUS_USER = False 强制记录,但需谨慎);
  • 修改中间件后,务必重启 Django 开发服务器(runserver)使配置生效;
  • 可通过调试确认:在视图中打印 request.user 和 request.user.pk,验证是否正常;也可在审计日志表(auditlog_logentry)中检查 actor_id 字段是否填充。

完成上述调整后,所有通过 Django Admin、视图或 ORM(如 save())触发的模型变更,都将自动记录操作人 ID,AUDITLOG_INCLUDE_ALL_MODELS = True 也将按预期工作。


# go  # session  # 跨域  # django  # 中间件  # 对象  # 可通过  # 这是  # 放在  # 尤其是  # 可在  # 都将  # 重启  # 也应  # 绑定  # 未被 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何打造高效商业网站?建站目的决定转化率  Laravel如何实现模型的全局作用域?(Global Scope示例)  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在香港免费服务器上快速搭建网站?  韩国服务器如何优化跨境访问实现高效连接?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  郑州企业网站制作公司,郑州招聘网站有哪些?  如何在云服务器上快速搭建个人网站?  详解阿里云nginx服务器多站点的配置  如何在 React 中条件性地遍历数组并渲染元素  如何选择PHP开源工具快速搭建网站?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何快速生成高效建站系统源代码?  HTML 中动态设置元素 name 属性的正确语法详解  如何快速辨别茅台真假?关键步骤解析  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  香港网站服务器数量如何影响SEO优化效果?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  七夕网站制作视频,七夕大促活动怎么报名?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何安全更换建站之星模板并保留数据?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Swift开发中switch语句值绑定模式  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel如何与Pusher实现实时通信?(WebSocket示例)  EditPlus中的正则表达式实战(6)  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何用美橙互联一键搭建多站合一网站?  5种Android数据存储方式汇总  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何为不同团队 ID 动态生成多个非值班状态按钮  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  香港服务器部署网站为何提示未备案?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程