Django Api-Key认证单元测试失败问题求助
解决Django API Key认证单元测试403问题
核心问题
你测试里用的SomeApiKeyValue是无效的——rest_framework_api_key的认证依赖数据库中存在的APIKey实例,临时测试数据库里默认没有这条记录,自然过不了认证。另外还要注意GET请求参数的传递方式是否和实际接口匹配。
修复步骤
1. 创建真实的APIKey测试实例
在setUp方法里生成一个有效的APIKey,用它自动生成的密钥来设置认证头,而不是自定义字符串。
2. 修正请求参数传递
如果你的接口是从GET请求体里读取参数(虽然不符合HTTP规范,但你的curl确实这么传了),要指定content_type='application/json',否则DRF会把data转成URL查询参数。
修改后的完整测试代码
from rest_framework.test import APITestCase, APIClient from rest_framework_api_key.models import APIKey from user_api.classes.UserController import GetBusinessUser from django.urls import reverse class ProcessUserRequestTest(APITestCase): def setUp(self): self.client = APIClient() # 创建测试用APIKey,获取自动生成的密钥 self.api_key, self.api_key_secret = APIKey.objects.create(name="test-api-key") # 用真实密钥设置认证头 self.client.credentials(HTTP_AUTHORIZATION=f'Api-Key {self.api_key_secret}') self.url = reverse('business_user') self.valid_payload = {'username': 'test@testing.local'} def test_get_business_user_request(self): # 按你的curl方式,从请求体传GET参数 response = self.client.get( self.url, data=self.valid_payload, format='json', content_type='application/json' ) # 如果接口是用URL查询参数接收(更规范),换成下面这行: # response = self.client.get(self.url, data=self.valid_payload) self.assertEqual(response.status_code, 200) self.assertEqual(response.data, GetBusinessUser(response.data).data)
额外排查项
- 确认视图的
HasAPIKey权限类是从rest_framework_api_key.permissions正确导入的。 - 检查
settings.py的MIDDLEWARE里是否添加了rest_framework_api_key.middleware.APICheckMiddleware。 - 如果视图权限是
HasAPIKey & IsAuthenticated(同时满足两种认证),还要在setUp里创建并登录测试用户:from django.contrib.auth.models import User def setUp(self): # ... 其他代码 self.test_user = User.objects.create_user(username='testuser', password='testpass123') self.client.login(username='testuser', password='testpass123')
内容的提问来源于stack exchange,提问作者Psymon25
相关产品推荐
相关产品推荐

