首页 文章

使用Client.get()请求测试内置`contrib.auth.login`

提问于
浏览
0

我的目标:使用Test Client访问 loging URL并发布 username / password 以登录用户 .

我在Django 2.1.4中使用内置的 contrib.auth.login

test.py:

from django.contrib.auth.models import User
from django.contrib import auth
from django.test import Client
from django.urls import reverse

def test_login_valid():
    U = {'username': 'bob','password': 'bobbobbob'}
    u = User.objects.create(**U)
    C = Client()
    r = C.post(reverse('login'), U)
    su = auth.get_user(r.wsgi_request)

    print(u)
    print(r)
    print(su)
    print(su.is_authenticated)
    print(r.wsgi_request.user)
    print(r.wsgi_request.user.is_authenticated)

运行测试:

pytest --capture=no a14n/tests.py::test_login_valid
(…)
bob
<TemplateResponse status_code=200, "text/html; charset=utf-8">
AnonymousUser
False
AnonymousUser
False
.

登记/ login.html的:

<form action="{% url 'login' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

urls.py:

from a14n import views as a14n_views

urlpatterns = [
    path('signup/', a14n_views.signup, name='signup'),
    path('', include('django.contrib.auth.urls')),
]

另一方面,在Django shell中,它完美无缺:

>>> from django.contrib.auth.models import User
>>> from django.test import Client
>>> from django.contrib import auth
>>> from django.urls import reverse
>>> U = {'username': 'bob','password': 'bobbobbob'}
>>> C = Client()
>>> r = C.post(reverse('login'), U)
>>> u = User.objects.create(**U)
>>> su = auth.get_user(r.wsgi_request)
>>> print(u)
bob
>>> print(r)
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/profile/">
>>> print(su)
bob
>>> print(r.wsgi_request.user)
bob
>>> print(r.wsgi_request.user.is_authenticated)
True
>>> print(su.is_authenticated)
True

为什么测试会给一个 TemplateResponse 对象和django shell一个 HttpResponseRedirect 作为响应?

无论如何,重定向与否,为什么测试无法登录用户?

谢谢 .

1 回答

  • 0

    我找到了解决方案!

    在我的测试中,我使用 u = User.objects.create(**U) 创建了一个带有清除密码的 user ,然后我的视图永远无法进行身份验证,因为 login() 需要一个哈希密码 .

    使用 u = User.objects.create_user(**U) ,测试用户的密码被哈希并且测试正在运行 .

    希望它会帮助某人:-)

相关问题