2015-04-09 3 views
0

Я внедрил логин пользователя в Django, используя следующий код;Django test client возвращает анонимного пользователя после входа в систему

В моем urls.py;

. 
. 
. 
    url(r'^login/', UserLogin.as_view(), name='userlogin'), 
. 
. 

На мой взгляд.py;

. 
. 
from django.contrib.auth.forms import AuthenticationForm  
. 
. 
. 
class UserLogin(FormView): 
    form_class = AuthenticationForm 
    template_name = "auth/login.html" 

    def get_success_url(self): 
     return reverse('userhome', kwargs={'pk': self.request.user.id}) 
. 
. 
. 

и мой auth/login.html is;

{% block head %} 
    <title>Open Radio | Login</title> 
{% endblock %} 

{% block body %} 
    <header> 
    <h1>Open Radio</h1> 
    <h2>Login Page</h2> 
    </header> 

    <section> 
    {% if form.errors %} 
     <p>Your username and password didn't match, please try again. </p> 
    {% endif %} 

    <form method="post" action="."> 
     {% csrf_token %} 
     <p> 
     <label for="id_username">Username:</label> 
     {{ form.username }} 
     </p> 
     <p> 
     <label for="id_password">Password:</label> 
     {{ form.password }} 
     </p> 
     {% if next %} 
     <input type="hidden" name="next" value="{{ next }}" /> 
     {% endif %} 
     <input type="submit" value="login" /> 
    </form> 
    </section> 
{% endblock %} 

Это работает и ведет меня к домашней странице пользователя, которую я определил.

Но когда я запускаю следующий тест;

class TestLoginPage(TestCase): 
    . 
    . 
    .  

    def test_page_logs_in(self): 
     """ 
     Tests if the login page actually logs a user in 
     """ 
     username = "someusername" 
     password = "somepassword" 
     user = User(username=username, 
        password=password) 
     user.save() 
     response = self.client.post(reverse("userlogin"), 
            {"username":username, 
            "password":password}, 
            follow=True) 
     assert response.context["user"].is_authenticated() 

Я получаю следующий сбой;

self = <stationrunner.tests.TestLoginPage testMethod=test_page_logs_in> 

    def test_page_logs_in(self): 
     """ 
     Tests if the login page actually logs a user in 
     """ 
     username = "someusername" 
     password = "somepassword" 
     user = User(username=username, 
        password=password) 
     user.save() 
     response = self.client.post(reverse("userlogin"), 
            {"username":username, 
            "password":password}, 
            follow=True) 
>  assert response.context["user"].is_authenticated() 
E  AssertionError: assert <bound method AnonymousUser.is_authenticated of <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>>() 
E  + where <bound method AnonymousUser.is_authenticated of <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>> = <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>>.is_authenticated 

Может кто-нибудь, пожалуйста, объясните, почему это происходит

ответ

2

Это Войти не удастся, потому что Джанго ожидает пароль, чтобы быть хэш, но вы сохранили его в виде простого текста. Сделайте это вместо того, чтобы:

user = User.objects.create_user(username=username, password=password) 

Редактировать

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

По крайней мере, вам нужно будет позвонить login() где-то на ваш взгляд; но, похоже, нет веской причины для использования вами собственного пользовательского представления, а не встроенного представления django.contrib.auth.views.login.

+0

Большое спасибо. Проблема теперь решена, но теперь у меня есть новая. 'E NoReverseMatch: Реверс для 'userhome' с аргументами '()' и ключевыми аргументами '{' pk ': None}' не найден. 1 образец (ы): ['(? P \\ d +) /'] 'Что это значит? Нужно ли мне создавать pk при создании? Это не может/не должно быть так правильно !? Или я пропустил что-то еще? –

+0

Нужно больше контекста: эта ошибка не исходит от кода, показанного здесь. Где вы вызываете 'reverse' (или используете тег' {% url%} 'для 'userhome'? Это может быть лучше, как новый вопрос. –

+0

Его там. Это происходит из метода 'get_success_url()' метода UserLogin (см. Мой view.py). Проблема заключается не в том, когда я запускаю свой проект. Как сказано, это прекрасно работает. Его когда я проверяю. .i.e. после того, как я создал объект так, как вы его научили, после выполнения своих работ представление UserLogin не может перейти к его URL-адресу успеха, поскольку у созданного объекта нет pk. Надеюсь, я поняла. –

Смежные вопросы