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
相关产品推荐
相关产品推荐

