Django DRF管理员权限注册接口测试报401错误求助
Django注册登录测试问题解决
1. 注册接口401错误的核心原因
你给注册视图加了IsAdminUser权限限制,但测试时没携带管理员用户的Token请求,所以接口返回401。IsAdminUser要求请求发起者是staff或超级管理员,再加上Token认证的要求,必须在请求头里带上Authorization: Token <管理员token>才能通过权限校验。
2. 测试用例修正步骤
(1)提前创建管理员并配置认证Token
在测试类的setUp方法里生成管理员用户和对应的Token,让测试客户端默认带上认证头:
from django.test import TestCase from django.contrib.auth import get_user_model from rest_framework.test import APIClient from rest_framework.authtoken.models import Token User = get_user_model() class AuthTests(TestCase): def setUp(self): self.client = APIClient() # 创建超级管理员用户 self.admin = User.objects.create_superuser( username='admin_test', email='admin@test.com', password='admin123456' ) # 生成管理员Token self.admin_token = Token.objects.create(user=self.admin) # 给客户端设置默认认证头 self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.admin_token.key}')
(2)编写注册接口测试用例
用已配置认证的客户端请求注册接口,再做断言:
def test_normal_user_register(self): register_data = { 'username': 'new_user', 'email': 'new@test.com', 'password': 'newpass123' } response = self.client.post('/api/register/', register_data, format='json') # 断言接口返回201创建成功 self.assertEqual(response.status_code, 201) # 断言数据库中已创建该用户 self.assertTrue(User.objects.filter(username='new_user').exists())
(3)如果注册接口本应开放给普通用户
要是你的注册接口是给普通用户自行注册用的,那别加IsAdminUser权限,直接改成AllowAny:
from rest_framework.permissions import AllowAny class RegisterView(generics.CreateAPIView): serializer_class = RegisterSerializer permission_classes = [AllowAny] # 替换原来的IsAdminUser
3. 断言不匹配问题排查
- 先打印
response.data看接口实际返回的内容,和你断言的预期值做对比 - 检查
RegisterSerializer的fields或to_representation方法,确认返回字段和测试里的断言字段一致 - 确认请求数据的格式、字段名和序列化器定义完全匹配(比如有没有写错字段名,是否用了
format='json')
内容的提问来源于stack exchange,提问作者Arbi Kullakshi
相关产品推荐
相关产品推荐

