我的目标:使用测试客户端访问loging
URL,并发布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)
,测试用户的密码被散列,测试正在进行。
希望它能帮助到某人:-(