
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',
]✅ 修正后的推荐顺序如下(已标注关键依赖):
BIZOSS-B2C是脱胎于贞龙B2B大型平台的网上商城系统、网上商店系统、网上购物系统的企业级B2C电子商务解决方案。系统设置:这里包含了网店的常用功能和全局配置的开关。包括 商店设置 、支付方式和配送方式 、邮件服务器设置、地区列表、友情链接、自定义导航栏、站点地图。商品管理:网店展示商品的核心。其中包括了 商品分类、商品类型、商品品牌、商品回收站、商品上下架等一些设置。促销管理:这个是我们网
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 也将按预期工作。









