如何在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全局配置,再给需要认证的视图单独指定安全要求:
- 修改
settings.py中的SWAGGER_SETTINGS:
SWAGGER_SETTINGS = { 'SECURITY_DEFINITIONS': { 'Basic': { 'type': 'basic' }, 'Bearer': { 'type': 'apiKey', 'name': 'Authorization', 'in': 'header' } }, 'USE_SESSION_AUTH': False, 'SECURITY_REQUIREMENTS': [] # 默认不要求任何认证 }
- 给需要认证的视图(比如
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:
- 在
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)
- 修改
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
相关产品推荐
相关产品推荐

