我的目标:使用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 回答
我找到了解决方案!
在我的测试中,我使用
u = User.objects.create(**U)
创建了一个带有清除密码的user
,然后我的视图永远无法进行身份验证,因为login()
需要一个哈希密码 .使用
u = User.objects.create_user(**U)
,测试用户的密码被哈希并且测试正在运行 .希望它会帮助某人:-)