Объект «AnonymousUser» не имеет атрибута «backend» customuser

Я использую django 1.7 python 3.4. Я создал собственный класс MyUser, производный от AbstractBaseUser. Теперь, когда я пытаюсь зарегистрировать пользователя, я получаю сообщение об ошибке «У объекта AnonymousUser нет атрибута «backend». просмотры.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'

модели.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

person sprksh    schedule 05.03.2015    source источник
comment
P.S. проблема не в set_password.   -  person sprksh    schedule 05.03.2015
comment
Я подозреваю, что authenticate терпит неудачу и возвращает None, и в этом случае login вернется к request.user, который является AnonymousUser без атрибута backend.   -  person knbk    schedule 05.03.2015
comment
Также пользователь не сохраняется в базе данных. Итак, даже если он попытается аутентифицироваться, что он будет аутентифицировать? P.S: я новичок в django и веб-разработке   -  person sprksh    schedule 05.03.2015
comment
MyUser.objects.create_myuser можете выложить код этого метода?   -  person knbk    schedule 05.03.2015
comment
@knbk выложил это, пожалуйста, посмотрите,   -  person sprksh    schedule 05.03.2015
comment
Установлен ли у вас соответствующий сервер аутентификации, который принимает электронную почту и пароль?   -  person knbk    schedule 05.03.2015
comment
Хорошо, класс MyUser наследуется от класса AbstractBaseUser. Также я явно определил USERNAME_FIELD = email. В этом случае мне нужен какой-либо другой сервер аутентификации   -  person sprksh    schedule 05.03.2015
comment
Документы не слишком ясны, но вы должны убедиться, что authenticate не возвращает None, прежде чем пытаться войти в систему пользователя. Однако это не объясняет, почему authenticate вообще не работает. У вас есть get_by_natural_key в вашем менеджере пользователей?   -  person knbk    schedule 05.03.2015
comment
нет, не определил. но я думаю, что проблема в том, что пользователь не сохраняется. Я попытался прокомментировать myuser.save(), но он показывает ту же ошибку. это означает, что пользователь все равно не сохраняется, так как он может быть аутентифицирован   -  person sprksh    schedule 05.03.2015
comment
Не обязательно, поведение будет таким же, если аутентификация не удалась по другой причине. Можете ли вы проверить, что пользователь существует в базе данных? Nvm о get_by_natural_key, это определено BaseUserManager. Можете ли вы опубликовать свою полную модель MyUser?   -  person knbk    schedule 05.03.2015
comment
Прямо сейчас у меня есть кое-что, метод сохранения переопределял метод сохранения в base.py и на самом деле не сохранял пользователя. позвольте мне исправить это, и если даже тогда это не сработает, я вернусь к вам ..   -  person sprksh    schedule 05.03.2015


Ответы (2)


Проблема довольно проста. Пользователь не сохраняется в базе данных. Как вы говорите, должна быть какая-то проблема с методом сохранения в вашей пользовательской модели. Кроме того, в методе сохранения нет ошибки, которая останавливает его, но он отлично работает как часть кода, за исключением сохранения объекта.

Итак, что происходит, когда вы регистрируетесь как пользователь, все работает нормально, но пользователь не сохраняется. После этого он пытается перезвонить пользователю и возвращает анонимного пользователя. Теперь при вызове любого атрибута пользователя будет возникать аналогичная ошибка.

Проверьте свой метод сохранения.

person Rohit    schedule 07.05.2016

Проблема здесь в том, что вы перенесли модели аутентификации в базу данных, а затем перенесли своего пользовательского пользователя в качестве второго шага.

Вам нужно начать с чистой базы данных и перенести своего пользовательского пользователя в первую команду миграции, которую вы вводите в базу данных.

В документации упоминается, что вы всегда должны создавать своего пользовательского пользователя table в качестве первого шага, иначе django попадет в затруднительное положение.

Предупреждение

Изменение AUTH_USER_MODEL сильно повлияет на структуру вашей базы данных. Он изменяет доступные таблицы и повлияет на построение внешних ключей и отношений «многие ко многим». Если вы собираетесь установить AUTH_USER_MODEL, вам следует установить его перед созданием любых миграций или запуском manage.py migrate в первый раз.

Изменение этого параметра после создания таблиц не поддерживается makemigrations и приведет к тому, что вам придется вручную исправлять схему, переносить данные из старой пользовательской таблицы и, возможно, вручную повторно применять некоторые миграции.

person ajaali    schedule 11.09.2015