Тестовый клиент Django не входит в систему

Я пытаюсь войти в тестовый клиент, используя встроенную функцию входа в систему. Я пытаюсь объединить тестовые представления, и мне нужно войти в систему, чтобы протестировать некоторые из них. Я пытался сделать это слишком долго, и мне нужна помощь. Несколько заметок:

create_user() действительно создает действительного пользователя, он использовался в других местах.

Из того, что я видел о client.login(), он возвращает логическое значение, когда я запускал свои тесты, ошибка была «False is not True», так что это кажется правильным.

Единственный способ, которым я успешно вошел в систему, - это вызвать client.post("/my/login/url", {имя пользователя и пароль в dict.}). Однако по какой-то причине он не остается в системе для всех моих тестовых случаев. что я нахожу ОЧЕНЬ странным.

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    self.user = create_user()
    self.logged_in = self.client.login(username=self.user.username, password=self.user.password)

def test_valid(self):
    self.assertTrue(self.logged_in)

Я изменил его на следующее:

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    self.password = "password"
    self.user = create_user(password=self.password)
    self.logged_in = self.client.login(username=self.user.username, password=self.password)

Все равно не получается войти.

create user находится в классе «Static» и имеет user_count, инициализированный как 0, функция выглядит следующим образом:

def create_user(username=None, password=None, email=None, is_superuser=False):
    if username is None:
        username = "user%d" % Static.user_count
        while User.objects.filter(username=username).count() != 0:
            Static.user_count += 1
            username = "user%d" % Static.user_count
    if password is None:
        password = "password"
    if email is None:
        email="user%[email protected]" % Static.user_count

    Static.user_count += 1
    user = User.objects.create(username=username, password=password,   is_superuser=is_superuser)

person mdw7326    schedule 07.11.2013    source источник


Ответы (1)


Вы не можете получить доступ к паролю напрямую. Атрибут password зашифрован. (См. управление паролями в Django.)

Например, здесь пример вывода пароля.

>>> user = User.objects.create_user(username='asdf', email='[email protected]', password='xxxx')
>>> user.password
'sha1$166e7$4028738f0c0df0e7ec3cec06843c35d2b5a1aae8'

Как видите, user.password не xxxx я дал.

Я бы изменил create_user, чтобы принять необязательный параметр пароля. И передайте пароль как для create_user, так и для client.login следующим образом:

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    password = 'secret'
    self.user = create_user(password=password)
    self.logged_in = self.client.login(username=self.user.username, password=password)

ОБНОВЛЕНИЕ

create_user следует использовать User.objects.create_user вместо User.objects.create . И созданный пользовательский объект должен быть возвращен:

def create_user(username=None, password=None, email=None, is_superuser=False):
    if username is None:
        username = "user%d" % Static.user_count
        while User.objects.filter(username=username).count() != 0:
            Static.user_count += 1
            username = "user%d" % Static.user_count
    if password is None:
        password = "password"
    if email is None:
        email="user%[email protected]" % Static.user_count

    Static.user_count += 1
    user = User.objects.create_user(username=username, password=password)
    #                   ^^^^^^^^^^^
    user.is_superuser = is_superuser
    user.save()
    return user # <---
person falsetru    schedule 07.11.2013
comment
Так есть ли способ получить пароль от пользователя? или мне просто нужно знать пароль? - person mdw7326; 07.11.2013
comment
@ user2278110, как упоминалось в ответе, пароль зашифрован (хеширован) и не может быть расшифрован. Вы должны передать его create_user (возможно, потребуется изменить create_user) и использовать этот пароль вместо self.user.password. - person falsetru; 07.11.2013
comment
@ user2278110, не могли бы вы показать содержимое функции create_user? - person falsetru; 07.11.2013
comment
Теперь он есть, но я совершенно уверен, что проблема не в create_user - person mdw7326; 07.11.2013
comment
@ user2278110, где оператор возврата в create_user? - person falsetru; 07.11.2013
comment
@user2278110, А если create_user в классе Static, почему бы не назвать его Static.create_user(..)? - person falsetru; 07.11.2013
comment
@ user2278110, я обновил ответ на create_user. Проверьте это. - person falsetru; 07.11.2013