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

如何在DRF Swagger(yasg)中区分视图的认证要求?

解决drf-yasg Swagger中无需认证视图显示认证选项的问题

方法一:给单个视图明确禁用认证选项

在无需认证的视图(比如register_user)的@swagger_auto_schema装饰器中添加security=[]参数,直接告诉Swagger该接口不需要任何认证:

修改views.py中的register_user视图:

@swagger_auto_schema(methods=['post'], request_body=UserSerializer, security=[])
@api_view(['POST'])
def register_user(request):
    serializer = UserSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
    return Response(serializer.data)

修改后,该接口在Swagger界面将不再显示Basic或Bearer的认证输入框。

方法二:全局配置默认不强制认证,按需给视图添加

如果你的API大部分接口无需认证,仅少数需要,可以调整Swagger全局配置,再给需要认证的视图单独指定安全要求:

  1. 修改settings.py中的SWAGGER_SETTINGS:
SWAGGER_SETTINGS = {
   'SECURITY_DEFINITIONS': {
      'Basic': {
            'type': 'basic'
      },
      'Bearer': {
            'type': 'apiKey',
            'name': 'Authorization',
            'in': 'header'
      }
   },
   'USE_SESSION_AUTH': False,
   'SECURITY_REQUIREMENTS': []  # 默认不要求任何认证
}
  1. 给需要认证的视图(比如add_mesure)添加安全要求:
@swagger_auto_schema(
    methods=['post'], 
    request_body=MesureSerializer,
    security=[{'Bearer': []}, {'Basic': []}]  # 指定需要Bearer或Basic认证
)
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def add_mesure(request):
    serializer = MesureSerializer(data=request.data, context={'request':request})
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    else:
        return Response(serializer._errors)

方法三:自动识别权限类(智能适配)

如果希望Swagger自动根据视图的permission_classes判断是否需要认证,可以自定义SchemaGenerator:

  1. 在api/urls.py中添加自定义生成器:
from drf_yasg.generators import OpenAPISchemaGenerator
from rest_framework.permissions import AllowAny

class CustomSchemaGenerator(OpenAPISchemaGenerator):
    def get_security_requirements(self, path, method):
        view = self.get_view(path, method)
        # 检查视图权限类是否包含AllowAny且无IsAuthenticated
        has_allow_any = AllowAny in [perm.__class__ for perm in view.permission_classes]
        has_is_authenticated = any(perm.__class__.__name__ == 'IsAuthenticated' for perm in view.permission_classes)
        if has_allow_any and not has_is_authenticated:
            return []
        return super().get_security_requirements(path, method)
  1. 修改schema_view的生成,使用自定义生成器:
schema_view = get_schema_view(
   openapi.Info(
      title="Snippets API",
      default_version='v1',
      description="Test description",
      terms_of_service="https://www.google.com/policies/terms/",
      contact=openapi.Contact(email="contact@snippets.local"),
      license=openapi.License(name="BSD License"),
   ),
   public=True,
   permission_classes=[permissions.AllowAny],
   generator_class=CustomSchemaGenerator,  # 应用自定义生成器
)

这样Swagger会自动识别视图权限,无需手动逐个配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:06:25