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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:24:02