【问题标题】:Django-AttributeError 'User' object has no attribute 'backend' (But....it does?)Django-AttributeError 'User' 对象没有属性 'backend' (但是......它有吗?)
【发布时间】:2011-08-27 10:41:39
【问题描述】:

为了在注册用户后登录,我手动设置了 user.backend 属性。它通常在我看来有效。在这种情况下,我试图通过 AJAX 注册用户。它正在引发 AttributeError。

这是我的代码:

 def register_async(request):
    if request.method=='POST':

    userform=MyUserCreationForm(request.POST)
    if userform.is_valid():
        #username of <30 char is required by Django User model.  I'm storing username as a hash of user email 

        user=userform.save(commit=False)
        user.username=hash(user.email)
        user.backend='django.contrib.auth.backends.ModelBackend'
        user.save()


        auth.login(request,user)
        user_status=1
        user_fname=user.first_name
        user_data=[{'user_status':user_status, 'user_fname':user_fname}]
        json_data=json.dumps(user_data)
        response=HttpResponse()
        response['Content-Type']="text/javascript"
        response.write(json_data)
        return response 

    else:
        user_data=[{'user_status':"0"}]
        json_data=json.dumps(user_data)
        response=HttpResponse()
        response['Content-Type']="text/javascript"
        response.write(json_data)
        return response 
else:
    return HttpResponse()

编辑——这里是 AJAX。看起来很标准

     //ajax registration.  
$('input#register_submit').click(function(event){
    $(this).attr('disabled','disabled');
    $('<div class="register-animation"><img src="{{site}}media/ajax-loader3.gif"/></div>').appendTo('#register_modal_btn');

    $.post("/register/", $('div#register_side form').serialize(), 
        function(data){
            $.each(data,function(){
            if(this.user_status==1){
                $('.register-animation').remove();
                $('.right_section .top').html('<ul><li class="sep_nav">Hi, '+ this.user_fname + '</li><li class="sep+nav"><a href="http://nabshack.com/logout/">Log Out</a></li><li class="refar_friend"><a href="http://nabshack.com/referral/">Refer a friend and get $50</a></li></ul>');
                $('#post_login_modal').dialog("close");

                $('a.login').unbind('click');
                $('li a.account').unbind('click');

            }       
            else{
            $('input#register_submit').removeAttr('disabled');
            $('.register-animation').remove();
            window.location='{{site}}register';
            }

        });
    },'json');
    return false;
    event.stopPropagation();
});

对于我来说,这个确切的代码几乎可以在非 ajax 视图中使用。什么给了?

谢谢

【问题讨论】:

  • 你也可以添加你的ajax代码吗?
  • 您是否将django.contrib.auth 用于User?如果是这样,那么该错误是完全有效的,因为User 没有该属性。将它添加到User 的唯一两种方法是通过配置文件,在这种情况下它将是User.get_profile().backend 或通过子类,在这种情况下它将是CustomUser.backend。如果您不使用 django.contrib.auth,请发布您的 User 模型的代码。
  • 我正在使用 django.contrib.auth。但是,您的观点并不准确。见这篇文章(stackoverflow.com/questions/5775268/…)。您可以直接在 User 模型上设置“后端”属性。除了那个线程之外,我还在其他视图中成功地实现了这个特性。我认为这是 ajax 在这里发挥作用。

标签: django authentication django-models django-authentication


【解决方案1】:

您必须先致电authenticate,然后才能致电loginauthenticate 在对象上设置一个属性,指出哪个后端已成功验证它并清除它以进行登录,这在您的代码中没有发生(这就是缺少的属性)。

文档:https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in -- 查看“首先调用 authenticate()”的小标注。

【讨论】:

  • 这不是真的,卢克。我知道通过阅读其他线程以及通过自己测试它来进行实验。您可以直接设置后端属性。查看我在上面的 cmets 中留下的另一个线程。您可能还想看看其他地方。手动设置后端是一种 hack,其效果与调用身份验证相同。
  • 好吧,承认点。您可以模拟调用authenticate效果。但是除非你有充分的理由,否则你不应该这样做,因为未来的一些更新可能会扩展 authenticate 所做的事情以及 Django 期望所做的事情。
【解决方案2】:

我会将此作为答案发布,但我应归功于上面 cmets 中的 https://stackoverflow.com/users/558699/benhttps://stackoverflow.com/a/5837046/1467342。我正在扫描这个问题并错过了我正在寻找的内容是在 cmets 中。到目前为止,手动添加后端对我来说是一个(hacky)修复:

user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)

在这两种情况下,我都依赖其他身份验证方法(电子邮件确认和管理员身份验证会话)来验证以该用户身份登录的权限。

【讨论】:

  • 虽然最好从 django.contrib.conf 导入设置并分配 settings.AUTHENTICATION_BACKENDS 以防万一使用自定义后端。
【解决方案3】:

在 Django 1.10 中,django.contrib.auth.login 现在采用 backend= 关键字参数!

https://code.djangoproject.com/ticket/24855

【讨论】:

  • 或者你可以直接使用login(request, user),它不会再报错了
猜你喜欢
  • 2021-06-18
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多