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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:30:40