Вход в Django генерирует исключение "<type 'exception.AttributeError'>" - PullRequest
0 голосов
/ 01 июня 2011

Я хочу войти в систему с помощью следующего кода:

try:
                user = User.objects.get(username = username)
                print "user found"

                if user.password == password and user.is_active:
                    print "user: " + str(user)
                    try:
                        print "test1"
                        login(request, user)
                        print "test2"
                    except:
                        print "error"
                        import sys
                        print "--> " + str(sys.exc_info()[0])
                        raise
                    user_is_valid = True
                    print "hell yeah!!"
            except:
                user = None
                print "failed"

Что дает следующий вывод консоли при входе в систему с активным пользователем:

user found
user: testuser@email.com
test1
error
--> <type 'exceptions.AttributeError'>
failed

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

1 Ответ

2 голосов
/ 01 июня 2011

Почему ты делаешь это? Во-первых, вы не должны ловить исключение только для его повторного повышения. Работая с DEBUG, Django предоставляет вам отличную страницу с ошибкой, которая показала бы вам фактическую ошибку и код, который ее вызывает, в частности, вы бы увидели, к какому атрибуту обращаются.

Скорее всего, ошибка в том, что вы не вызвали authenticate для пользователя, который, наряду с проверкой пароля, также добавляет запись атрибута, бэкэнд аутентификации которого аутентифицировал этого пользователя. Документация о том, как зарегистрировать пользователя в , совершенно ясно, что вам нужно вызывать это - обратите внимание на поле с надписью «вызов authenticate first».

Третье, что вам определенно не следует делать, это проверять пароль как текст - Django хранит их как хэши, поэтому вам нужно сравнить значение хэша. Опять же, authenticate позаботится об этом за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...