【问题标题】:Django 1.7 'AnonymousUser' object has no attribute 'backend'Django 1.7 'AnonymousUser' 对象没有属性 'backend'
【发布时间】:2015-06-11 16:09:29
【问题描述】:

我是 Django 的新手。我尝试在注册用户后创建自动登录。但我失败了。 我为用户名和密码验证创建了一个自定义身份验证后端。

class EmailBackend(object):
def authenticate(self, username=None, password=None):
    user_cls = get_user_model()
    try:
        user = user_cls.objects.get(email=username)
        if user.check_password(password):
            return user
    except user_cls.DoesNotExist:
        return None


def get_user(self, user_id):
    user_cls = get_user_model()
    try:
        return user_cls.objects.get(pk=user_id)
    except user_cls.DoesNotExist:
        return None

AUTHENTICATION_BACKENDS = (
    'user.back_auth.EmailBackend',
    'django.contrib.auth.backends.ModelBackend',
)

我尝试为用户注册后自动登录:

def register(request):
if request.method == 'POST':
    user_form = UserForm(request.POST)
    if user_form.is_valid():
        user = user_form.save()
        messages.info(request, "Thanks for registering. You are now logged in.")
        user = authenticate(username=request.POST['username'],
                            password=request.POST['password'])
        login(request, user)
        return HttpResponseRedirect("/")
else:
    user_form = UserForm()
    return render(request,
            'user/register.html',
            {'user_form': user_form } )

但是,我得到了下一个:

/user/register/ 处的 AttributeError “AnonymousUser”对象没有“后端”属性

【问题讨论】:

  • 您在 UserForm 中是否有任何save 方法,或者您能否确保已创建用户或什么?并告诉密码的样子(明文或哈希)?
  • 我在用户窗体中没有其他保存方法。并且密码是明文
  • 为什么你还有一个自定义的身份验证后端?它与标准的没有什么不同。
  • 允许使用邮箱和用户名进行身份验证
  • @AleksanderGordienko 试过我的答案是有效的

标签: python django


【解决方案1】:

您的用户创建方法是错误的,因为我假设您正在以纯文本格式保存用户。

两种方式...

使用@987654321@的方法

使用@987654322@的方法

【讨论】:

    【解决方案2】:

    我的工作版本:

    def register(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        if user_form.is_valid():
            user = user_form.save()
            user.set_password(request.POST['password'])
            user.save()
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username,password=password)
            user.backend = 'django.contrib.auth.backends.ModelBackend'
            login(request, user)
        messages.info(request, "Thanks for register!")
        return HttpResponseRedirect("/")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2019-10-21
      • 2017-05-27
      • 2020-10-21
      相关资源
      最近更新 更多