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

Django触发user_logged_in信号报AttributeError: 'django.http.request'无user属性

问题排查及解决方案

1. 核心报错根因:信号回调函数参数使用错误

你写的user_logged_in信号回调没有接收Django内置的传递参数,直接调用了未定义的request变量,Python会默认将django.http.request模块当成request对象调用,自然不存在user属性。

修复后的信号代码如下:

def auth_done(sender, request, user, **kwargs):
    print('User has logged in')
    # 改用get_or_create避免重复创建Token触发唯一性约束报错
    tok, created = Token.objects.get_or_create(user=user)
    # key是属性不是方法,去掉调用括号
    print(tok.key)


user_logged_in.connect(auth_done, sender=User)

说明:user_logged_in信号默认会传递request和已登录的user两个参数,直接接收后即可使用,也可以直接用传入的user参数,不需要额外从request中取值,更简洁。

2. 其他潜在问题修复

2.1 权限类大小写错误

Settings配置里的rest_framework.permissions.isAuthenticated大小写不符合DRF规范,DRF的权限类为大驼峰命名,修正后配置如下:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        # 首字母大写
        'rest_framework.permissions.IsAuthenticated'
    ]
}

2.2 重复创建Token问题

当前登录视图里已经写了Token.objects.create(user=request.user),信号触发时又会执行一次创建逻辑,会触发UNIQUE constraint failed唯一性约束报错,二选一删除即可,推荐保留信号里的逻辑,删除视图中的Token创建代码,避免逻辑冗余。

2.3 POST参数取值优化

视图中直接用request.POST['first_name']取值,对应参数不存在时会直接抛出异常,建议改用get方法做容错:

name = request.POST.get('first_name')
password = request.POST.get('password')

内容的提问来源于stack exchange,提问作者Atif Shafi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:51:03