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:自定义权限类配置白名单(适合批量公开接口)
如果有多个固定路径的接口需要公开,不想逐个视图修改配置,可以自定义权限类实现路径白名单逻辑:
- 新建自定义权限类,比如在项目的
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)
- 修改
settings.py中的全局权限配置,替换为你自定义的权限类:
REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES": [ # 替换为自定义权限类的实际导入路径 "common.permissions.WhiteListAPIKeyPermission", ] }
提示:如果公开路径包含动态参数,可以把路径匹配逻辑改成正则匹配,适配动态路由场景。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

