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



我的目标:使用测试客户端访问logingURL,并发布username/password以让用户登录。

我在Django2.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
.

registration/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

为什么测试会给ma一个TemplateResponse对象,而django-shell一个HttpResponseRedirect作为响应?

不管怎样,重定向与否,为什么测试不能让用户登录?

Thx。

我找到了解决方案!

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

使用u = User.objects.create_user(**U)测试用户的密码被散列,测试正在进行。

希望它能帮助到某人:-(

相关内容

最新更新