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

Django REST Framework配置API Key后如何开放免鉴权API接口

DRF API Key 开放无鉴权接口配置方案

你当前全局配置了所有接口默认校验API Key,无需修改全局鉴权逻辑、也不需要引入JWT,即可实现特定接口免携带Authorization请求头访问,具体有两种常用实现方式:

方式1:单视图覆盖权限配置(最推荐,适合少量公开接口)

DRF的视图级权限优先级高于全局默认权限,只需要给需要公开的接口单独指定AllowAny权限,即可跳过API Key校验。

  • 函数视图配置示例:
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response

# 替换为你的接口支持的请求方法
@api_view(["GET", "POST"])
@permission_classes([AllowAny])
def public_integration_api(request):
    # 编写接口业务逻辑
    return Response({"status": "success", "data": "公开接口无需API Key即可访问"})
  • 类视图/视图集配置示例:
from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
# 如果用视图集就导入对应的ViewSet类,配置方式完全一致

class PublicIntegrationView(APIView):
    # 覆盖全局权限配置,直接放行所有请求
    permission_classes = [AllowAny]

    def get(self, request):
        # 编写接口业务逻辑
        return Response({"status": "success", "data": "公开接口无需API Key即可访问"})

方式2:自定义权限类配置白名单(适合批量公开接口)

如果有多个固定路径的接口需要公开,不想逐个视图修改配置,可以自定义权限类实现路径白名单逻辑:

  1. 新建自定义权限类,比如在项目的common/permissions.py中编写如下代码:
from rest_framework_api_key.permissions import HasAPIKey

class WhiteListAPIKeyPermission(HasAPIKey):
    # 填入所有不需要校验API Key的接口路径
    PUBLIC_PATH_LIST = [
        "/api/public/callback/",
        "/api/public/notify/",
    ]

    def has_permission(self, request, view):
        # 命中白名单路径直接放行
        if request.path in self.PUBLIC_PATH_LIST:
            return True
        # 非白名单路径走原有API Key校验逻辑
        return super().has_permission(request, view)
  1. 修改settings.py中的全局权限配置,替换为你自定义的权限类:
REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": [
        # 替换为自定义权限类的实际导入路径
        "common.permissions.WhiteListAPIKeyPermission",
    ]
}

提示:如果公开路径包含动态参数,可以把路径匹配逻辑改成正则匹配,适配动态路由场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:33:25