Django单元测试中DRF认证Token不被接受返回401问题求助
问题排查及修复方案
以下是代码中存在的明确错误,按优先级修复即可解决401认证失败问题:
1. 变量引用错误(直接导致Token关联失败)
setUp方法中创建Token的代码存在变量名错误,你定义的用户实例是self.user,创建Token时引用了未定义的user变量:
# 错误写法 self.token = Token.objects.create(user=user) # 修正为 self.token = Token.objects.create(user=self.user)
2. 用户密码未正确哈希(导致身份校验失败)
Django用户认证逻辑会校验密码哈希值,你直接用objects.create创建用户,密码会以明文形式存储,无法通过认证校验:
# 错误写法:明文存储密码 self.user =User.objects.create( username="admin", password="admin", email="test@necktie.com", first_name="test first name", last_name="test last name", is_superuser=True, is_staff=True, is_active=True ) # 修正为:用create_user方法自动对密码做哈希处理 self.user = User.objects.create_user( username="admin", password="admin", email="test@necktie.com", first_name="test first name", last_name="test last name", is_superuser=True, is_staff=True, is_active=True )
3. 认证前缀不匹配
DRF自带的TokenAuthentication默认认证前缀是Token,你传Bearer前缀会导致框架无法识别token,二选一修复即可:
- 方案1:修改测试代码的认证头,匹配默认配置
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
- 方案2:在settings.py中修改DRF配置,指定使用Bearer前缀
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authtoken.authentication.TokenAuthentication', ], } AUTHENTICATION_HEADER_PREFIX = 'Bearer'
4. 可选优化:用户详情路由参数硬编码问题
你硬编码了用户id为1reverse('user-detail', args=[1]),测试数据库中自增id不一定每次都是1,建议修改为:
self.users_detail_url = reverse('user-detail', args=[self.user.id])
其他说明
不存在本地数据库和测试数据库的认证逻辑混淆问题,Django测试默认会自动创建独立的临时测试库,测试结束后自动销毁,不会和本地库产生数据交叉。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

