【问题标题】:'AnonymousUser' object has no attribute 'backend' customuser'AnonymousUser' 对象没有属性 'backend' customuser
【发布时间】:2015-03-05 10:31:47
【问题描述】:

我正在使用 django 1.7 python 3.4 我创建了一个派生自 AbstractBaseUser 的自定义 MyUser 类。现在,当我尝试注册用户时,我收到错误“AnonymousUser”对象没有属性“后端”。 视图.py

def signup(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if not form.is_valid():
            return "form invalid"  # render(request, 'auth/signup.html', {'form': form})
        else:

            email = form.cleaned_data.get('email')
            enterprise = form.cleaned_data.get('enterprise')
            first_name = form.cleaned_data.get('first_name')
            last_name = form.cleaned_data.get('last_name')
            password = form.cleaned_data.get('password')
            MyUser.objects.create_myuser(email=email, enterprise=enterprise, first_name=first_name, last_name=last_name,
                                         password=password,)
            myuser = authenticate(email=email, password=password)
            # myuser.backend = 'django.contrib.auth.backends.ModelBackend'
            # authenticate(email=email, password=password)
            login(request, myuser)
            welcome_post = u'{0}from {1} has joined the network.'.format(myuser.first_name, myuser.enterprise)
            node = Node(myuser=myuser, post=welcome_post)
            node.save()
            return redirect('/')
    else:
        return render(request, 'accounts/signup.html', {'form': SignupForm()})

另外,用户没有被保存到数据库中。

Traceback:
File "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\sp\ilog_dev\accounts\views.py" in signup
  27.             login(request, myuser)
File "C:\Python34\lib\site-packages\django\contrib\auth\__init__.py" in login
  98.     request.session[BACKEND_SESSION_KEY] = user.backend
File "C:\Python34\lib\site-packages\django\utils\functional.py" in inner
  225.         return func(self._wrapped, *args)

Exception Type: AttributeError at /accounts/signup/
Exception Value: 'AnonymousUser' object has no attribute 'backend'

models.py

class MyUserManager(BaseUserManager):
    def create_myuser(self, email, first_name, last_name, enterprise, password=None):
        if not email:
            raise ValueError('Users must have an email address')
        if not first_name:
            raise ValueError("must have a first_name")
        if enterprise not in Enterprise.objects.all():
            raise ValueError("please specify a valid enterprise or register a new one")

        myuser = self.model(email=self.normalize_email(email), first_name=first_name,
                            last_name=last_name, enterprise=enterprise,)

        myuser.set_password(password)
        myuser.save()  # using=self._db
        print("user saved")

        return myuser

【问题讨论】:

  • P.S.问题不是由于“set_password”的事情。
  • 我怀疑authenticate 失败并返回None,在这种情况下login 将退回到request.user,这是一个没有backend 属性的AnonymousUser
  • 用户也没有被保存到数据库中。因此,即使它尝试进行身份验证,它将进行什么身份验证。? P.S:我是 django 和 Web 开发的新手
  • MyUser.objects.create_myuser可以把这个方法的代码贴出来吗?
  • @knbk 已经发过了,请看一下,

标签: django registration django-custom-user


【解决方案1】:

问题很简单。用户未保存到数据库中。正如您所说,您的用户模型中的保存方法一定有问题。此外,save 方法没有阻止它的错误,但它作为一段代码工作正常,除了保存对象

因此,当您以用户身份注册时,一切运行正常,但用户未保存。之后它会尝试回调用户并返回匿名用户。现在,当您调用用户的任何属性时,都会引发类似的错误。

检查您的保存方法。

【讨论】:

    【解决方案2】:

    这里的问题是您将身份验证模型迁移到数据库,然后迁移自定义用户作为第二步。

    您需要从一个干净的数据库开始,并在您向数据库发出的第一个迁移命令中迁移您的自定义用户。

    documentation 中提到您应该始终将创建自定义用户表作为第一步,否则 django 将陷入困境。

    警告

    更改 AUTH_USER_MODEL 对您的数据库结构有很大影响。它改变了可用的表,它会影响外键和多对多关系的构建。如果您打算设置 AUTH_USER_MODEL,则应在创建任何迁移或第一次运行 manage.py migrate 之前设置它。

    makemigrations 不支持在创建表后更改此设置,这将导致您必须手动修复架构、从旧用户表移植数据,并可能手动重新应用一些迁移。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2012-03-06
      • 2020-10-21
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2020-10-13
      相关资源
      最近更新 更多