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

使用DRF和rest_framework_api_key发起POST请求为何返回403?

解决方案

1. 修正API密钥请求头格式

rest_framework_api_key默认要求授权头格式为 Api-Key <你的密钥>,你的请求直接写了密钥,缺少必要前缀。修改请求的Authorization头:

fetch('/create-speech', {
    method: 'POST',
    body: JSON.stringify({
        voice_name: "es-US-Neural2-B",
        text: "Estoy feliz"
    }),
    headers: { 
        'Authorization': 'Api-Key 0tSMNivu.f8DOBrHTTKfMQBGANNbjl5BJQcswN9ay', // 补充Api-Key前缀
        'Content-Type': 'application/json'
    }
})

2. 确认已创建有效的APIKey实例

你必须在Django中生成合法的APIKey才能通过认证:

  • 若未创建超级用户,先执行 python manage.py createsuperuser
  • 登录Django admin后台,找到API Keys选项,创建新的APIKey,复制生成的密钥(注意密钥仅显示一次)
  • 确保请求中使用的密钥和后台生成的完全一致

3. 修复视图获取请求数据的方式

你的请求发送的是JSON格式,但视图用request.POST只能解析表单编码数据,改用DRF提供的request.data自动适配多种格式:

@api_view(["POST"])
def tts_view(request):
  data = request.data  # 替换request.POST为request.data

  voice_name = data.get("voice_name")
  text = data.get("text")

  if not voice_name or not text:
    return JsonResponse({"error": "Missing voice_name or text"}, status=400)

  return JsonResponse({"wav": text_to_wav(voice_name, text)}, status=200, safe=False)

4. 排除API视图的CSRF检查(可选)

虽然@api_view默认对非浏览器请求跳过CSRF检查,但从浏览器控制台发起请求可能仍受影响,给视图添加@csrf_exempt装饰器:

from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from django.http import JsonResponse

@csrf_exempt
@api_view(["POST"])
def tts_view(request):
  data = request.data
  # 剩余代码保持不变

5. 验证权限配置正确性

确保REST_FRAMEWORK配置中仅保留API密钥权限类:

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework_api_key.permissions.HasAPIKey",
    ]
}

按上述步骤逐一排查调整,即可解决403认证失败问题。

内容的提问来源于stack exchange,提问作者Joaquin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:20