You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:45:31