You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django signals不触发已尝试所有方案,JWT认证场景下求排查解决

问题根本原因

Django 内置的 user_logged_in、user_logged_out 信号仅在调用 Django 原生的 auth.login()、auth.logout() 方法时才会被触发。你当前使用 JWT 做身份认证,JWT 的登录、登出逻辑不会调用 Django 原生的登录登出方法,所以你写的信号接收器不会被执行。你已有的 apps.py、settings 注册配置本身没有问题,无需调整。

解决方案

假设你使用的是最常用的 djangorestframework-simplejwt 库实现 JWT 认证,可通过以下方式实现相同需求:

  • 首先确认你已经在 settings.py 中注册了黑名单应用(用于监听登出事件):
    INSTALLED_APPS = [
        # 其他原有应用
        'rest_framework_simplejwt.token_blacklist',
    ]
    
  • 改写 signals.py 监听 simplejwt 提供的内置信号即可:
    from django.contrib.auth import get_user_model
    from django.dispatch import receiver
    from rest_framework_simplejwt.signals import token_obtained
    from rest_framework_simplejwt.token_blacklist.signals import blacklist_added
    from .models import LoggedInUser
    
    User = get_user_model()
    
    # 登录成功(拿到token)触发
    @receiver(token_obtained)
    def when_user_logs_in(sender, request, user, **kwargs):
        print('user_logs_signal is called')
        LoggedInUser.objects.get_or_create(user=user)
    
    # 登出(token加入黑名单)触发
    @receiver(blacklist_added)
    def when_user_logs_out(sender, token, **kwargs):
        print('user logs out signal is called')
        user_id = token.payload['user_id']
        user = User.objects.get(id=user_id)
        logged_in_user, created = LoggedInUser.objects.get_or_create(user=user)
        if not created:
            logged_in_user.delete()
    

如果你没有使用 djangorestframework-simplejwt,也可以选择在自定义的登录、登出接口逻辑里,手动触发你需要执行的代码,或者手动发送 Django 原生的登录登出信号:

# 登录接口逻辑,验证账号密码成功后加这一行
from django.contrib.auth.signals import user_logged_in
user_logged_in.send(sender=User, request=request, user=当前登录用户对象)
原有代码注意事项

你原有登出信号的代码存在语法错误:LoggedInUser.objects.get_or_create(user=kwargs.get('user')).delete(),get_or_create 方法返回的是 (实例对象, 是否新创建) 的元组,直接调用 delete 会抛出异常,需要先取值再调用删除方法。

内容的提问来源于stack exchange,提问作者Dhruv Singhal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:45:10