使用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
相关产品推荐
相关产品推荐

