【问题标题】:'AnonymousUser' object has no attribute 'backend''AnonymousUser' 对象没有属性 'backend'
【发布时间】:2011-11-30 04:54:23
【问题描述】:

使用 django-socialregistration,出现以下错误:

'AnonymousUser' object has no attribute 'backend'

如何,

  1. 我点击 facebook connect url。
  2. 这让我使用 Facebook 并要求我登录。所以我做了,请求许可,我同意了。
  3. 之后,它会将我重定向到我的网站。并要求设置。我提供用户和电子邮件地址。
  4. 提交后,出现上述错误:

跟踪点:

path/to_file/socialregistration/views.py in post
128.      self.login(request, user)

有谁知道,怎么了?

【问题讨论】:

  • 您的AnonymousUser 类对象没有backend 属性。这就是问题所在。
  • 我知道。我的问题是为什么 django-socialregistration 无法获得有效用户,但却获得了 AnonymousUser
  • 你能粘贴完整的追溯吗?
  • 感谢 meson10,它现在可以工作了。我忘记了以下设置的愚蠢错误:AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'socialregistration.contrib.facebook.auth.FacebookAuth')
  • 您好,您在这方面有什么进展吗? ?我面临着类似的困难。不过,我没有使用任何社交验证。我只是在使用 django.contrib.auth.login

标签: python django


【解决方案1】:

哦,我以前一直收到这个错误,基本上是你在打电话

self.login(request, user)

无需调用

authenticate(username=user, password=pwd)

第一

当你调用authenticate 时,django 会设置用户的后端属性,注意使用哪个后端,更多详细信息请参见此处 https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.authenticate

【讨论】:

  • 不,保罗,这不是我的情况。我的情况是我忘记了以下设置的愚蠢错误:AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'socialregistration.contrib.facebook.auth.FacebookAuth')
【解决方案2】:

对于新注册的用户,我遇到了同样的错误。

def attempt_login(self, email, password):
    user = authenticate(username=email, password=password)
    login(self.request, user)

    return user 

我检查了数据库并且注册后已经创建了用户,但是这个错误仍然存​​在。

我发现 - 用户的登录 (email) 超过 30 个字符,并且表单字段没有验证。数据库中的用户名为get truncated,因此对不存在的登录调用了身份验证。

254 - 字符是电子邮件字段的建议长度。

解决方案: emailfield-max_length-r11092.patch

【讨论】:

    【解决方案3】:

    我刚刚收到此错误并找到此帖子..我的解决方案是在注册过程中。当用户注册时,我的 api 和序列化程序没有对密码进行哈希处理。所以在 api_view 我必须像这样手动对密码进行哈希处理..

        from django.contrib.auth.hashers import make_password
    
        # In the register api..
        @ensure_csrf_cookie
        @api_view(['POST'])
        def register_api(request):
    
            # Anywhere before the serializer
            request.DATA['password'] = make_password(request.DATA['password'])
    
            # Then the serializer
            serializer = RegisterSerializer(data=request.DATA)
    
            # ... etc.. Note that if you want to login after register you will have
            # to store the initial password is some buffer because.. authentication
            # the none hashed version.. then
                 authenticate(username=request.DATA['username'], password=someBuffer)
    

    希望对某人有所帮助..

    【讨论】:

    • 给你的一些笔记。如果您使用 DATA 而不是标头来发送密码 - 这些密码记录在服务器的日志文件和发送者的服务器中。因此,请使用标题代替密码传输:new_password = request.headers.get['password']。另外,值得使用特殊功能:user = User.objects.create_user(username=username, email=email, password=new_password)
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2012-03-06
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2019-10-21
    相关资源
    最近更新 更多