Django测试客户端POST登录请求出现403错误求助
问题原因及解决建议
核心问题1:用户密码存储方式错误
测试代码里用User.objects.create直接设置password字段,会把明文密码存入数据库,但Django的User模型要求密码必须经过哈希处理。视图中用User.check_password验证时,会将输入的明文和数据库里的明文(而非哈希值)对比,导致验证失败,触发PermissionDenied返回403状态码。
修复方法:
修改setUp方法,用set_password处理密码后再保存:
def setUp(self): user = User.objects.create( username='JohnnyBoy', email="email@gmail.com", first_name="John", last_name="Smith", ) user.set_password('pass123!') # 对密码进行哈希处理 user.save()
核心问题2:POST请求的JSON数据传递错误
测试中指定了content_type="application/json",但直接传入Python字典,Django测试客户端不会自动把它序列化为JSON字符串,可能导致视图里request.data无法正确获取用户名和密码,进而触发验证失败。
修复方法:
引入json模块,把字典转成JSON字符串后再传递:
import json def test_user_login_POST(self): req_url = reverse('user-login') login_details = { 'username': 'JohnnyBoy', 'password': 'pass123!' } # 将字典序列化为JSON字符串 response = self.client.post(req_url, json.dumps(login_details), content_type="application/json") print(response) self.assertEqual(response.status_code, 202)
额外优化建议
视图里的密码验证可以更规范,建议用User实例的check_password方法替代类方法:
# 替换原代码中的密码验证行 if not user_to_login.check_password(password): raise PermissionDenied('Invalid credentials.', code=404)
内容的提问来源于stack exchange,提问作者mangomadness
相关产品推荐
相关产品推荐

