Django测试客户端POST请求,获取403错误



我第一次尝试测试一些客户端请求,并且能够成功地发送POST请求来注册新用户。然而,当我尝试登录时,我收到了一个403错误,我不确定是什么原因导致的……我想我可能在测试中错过了什么?我已成功登录到已部署的应用程序。

错误消息:

======================================================================
FAIL: test_user_login_POST (jwt_auth.tests.TestUsers)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jz/Development/BetterCred/jwt_auth/tests.py", line 32, in test_user_login_POST
self.assertEqual(response.status_code, 202)
AssertionError: 403 != 202
----------------------------------------------------------------------
Ran 3 tests in 1.416s

测试:

def setUp(self):
User.objects.create(
username = 'JohnnyBoy',
password = 'pass123!',
email = "email@gmail.com",
first_name = "John",
last_name = "Smith",
)
def test_user_login_POST(self):
req_url = reverse('user-login')
login_details = {
'username': 'JohnnyBoy',
'password': 'pass123!'
}
response = self.client.post(req_url, login_details, content_type="application/json")
print(response)
self.assertEqual(response.status_code, 202)

视图(我添加了代码=404,看看我的测试是否达到了那个点,但看起来不是(:

class LoginView(APIView):
# POST - Login a user and return a token
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
try:
user_to_login = User.objects.get(username = username)
except User.DoesNotExist:
raise PermissionDenied('Invalid credentials.', code = 404)

if not User.check_password(user_to_login, password):
raise PermissionDenied('Invalid credentials.', code = 404)

exp_time = datetime.now() + timedelta(weeks = 1)
token = jwt.encode(
{
'sub': user_to_login.id,
'exp': int(exp_time.strftime('%s')),
}, 
settings.SECRET_KEY,
'HS256'
)
return Response(
{ 
'message': f'Welcome back {user_to_login.first_name}!',
'token': token,
},
status.HTTP_202_ACCEPTED
)

我很感激任何建议或提示!

在进一步阅读Django测试文档后,我了解到我不能简单地使用"password"设置我为测试创建的用户的密码:"pass123!",但需要使用.set_password((,因为密码需要以正确的哈希格式存储。

下面的相关Django文档片段,供将来遇到类似问题的人使用!:

请记住,如果您希望测试用户有密码,则不能通过直接设置密码属性来设置用户的密码–必须使用set_password((函数来存储正确散列的暗语或者,您可以使用create_user((helper方法创建一个具有正确散列密码的新用户。

相关内容

最新更新