Django应用测试:APIClient获取API Token失败求助
Django APIClient 获取Token失败的解决办法
可能的原因及对应方案
1. 测试数据库未创建目标用户
测试用例默认使用独立的测试数据库,和本地开发/生产数据库不共享数据,你用到的root用户大概率不存在于测试库中。解决方法是在测试用例的初始化步骤里创建测试用户:
from django.contrib.auth.models import User from rest_framework.test import APIClient, TestCase class TokenTest(TestCase): def setUp(self): # 创建带哈希密码的测试用户 self.user = User.objects.create_user(username='root', password='root') self.client = APIClient() def test_obtain_token(self): response = self.client.post('/api-token-auth/', data={"username":"root", "password":"root"}) # 验证请求成功并返回Token self.assertEqual(response.status_code, 200) self.assertIn('token', response.json())
2. 请求数据格式不匹配
如果你的/api-token-auth/视图仅接受JSON格式请求,而APIClient的data参数默认发送表单编码数据,此时需要改用json参数传递请求体:
# 用json参数替代data,直接发送JSON格式数据 response = self.client.post('/api-token-auth/', json={"username":"root", "password":"root"}) token_data = response.json()
3. 用户密码未正确哈希
如果手动创建用户时用了User.objects.create而非create_user,密码会以明文存储,导致认证失败。必须确保密码经过哈希处理:
# 错误示例:密码未哈希 user = User.objects.create(username='root', password='root') # 正确示例1:用create_user自动哈希 user = User.objects.create_user(username='root', password='root') # 正确示例2:手动设置哈希密码 user = User.objects.create(username='root') user.set_password('root') user.save()
4. 检查测试环境配置
确认测试环境的settings.py中,REST Framework的认证配置正确:
INSTALLED_APPS包含rest_framework.authtokenDEFAULT_AUTHENTICATION_CLASSES包含rest_framework.authentication.TokenAuthentication
内容的提问来源于stack exchange,提问作者koolaa12
相关产品推荐
相关产品推荐

