欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【后端】【django-drf】【drf-spectacular】总结:在 drf-spectacular 中添加 API 注释的方法

【后端】【django-drf】【drf-spectacular】总结:在 drf-spectacular 中添加 API 注释的方法

2025/3/16 15:56:09 来源:https://blog.csdn.net/qq_59344127/article/details/146279997  浏览:    关键词:【后端】【django-drf】【drf-spectacular】总结:在 drf-spectacular 中添加 API 注释的方法

总结:在 drf-spectacular 中添加 API 注释的方法

drf-spectacular 中,可以通过几种不同的方式来添加 API 注释(如 summarytagsdescription 等),以生成更具描述性的 OpenAPI 文档。

(一)全局配置:修改 API 的标题、描述等信息

可以在 settings.py 中使用 SPECTACULAR_SETTINGS 配置全局的 API 信息,如 API 名称、描述、版本等。

SPECTACULAR_SETTINGS = {'TITLE': "My API",  # API 标题'DESCRIPTION': "这是 API 文档的描述信息",  # API 描述'VERSION': "v1.0",  # API 版本'CONTACT': {'name': "API Support",'email': "support@example.com",'url': "https://www.example.com/support",},'LICENSE': {'name': "MIT License",'url': "https://opensource.org/licenses/MIT",},'TOS': "https://www.example.com/terms/",
}

(二)在视图中添加注释:使用 @extend_schema@extend_schema_view

1. 使用 @extend_schema 添加单个视图的注释

可以通过 @extend_schema 修饰单个视图方法,添加 summarydescriptiontags 等注释信息。

from drf_spectacular.utils import extend_schema
from rest_framework.views import APIView
from rest_framework.response import Responseclass MyAPIView(APIView):@extend_schema(summary="获取用户信息",  # API 简短描述description="此端点用于获取用户的详细信息",  # API 详细描述tags=["用户管理"],  # API 分类标签)def get(self, request):return Response({"name": "Tom"})
2. 使用 @extend_schema_view 添加视图集的注释

如果要批量修改一个 ViewSet 中的多个方法注释,可以使用 @extend_schema_view

from drf_spectacular.utils import extend_schema_view, extend_schema@extend_schema_view(list=extend_schema(summary="获取用户列表", tags=["用户管理"]),create=extend_schema(summary="创建新用户", tags=["用户管理"]),
)
class CustomUserViewSet(viewsets.ModelViewSet):queryset = CustomUser.objects.all()serializer_class = CustomUserSerializerpermission_classes = [AllowAny]

(三)自定义请求参数、响应格式和示例

1. 自定义查询参数

可以使用 OpenApiParameter 定义查询参数,并为其添加说明。

from drf_spectacular.utils import OpenApiParameterclass UserSearchView(APIView):@extend_schema(parameters=[OpenApiParameter(name="q", type=str, description="搜索关键字"),OpenApiParameter(name="page", type=int, description="分页页码", default=1),],summary="搜索用户",tags=["用户管理"],)def get(self, request):return Response({"results": []})
2. 自定义请求体

可以为 POST 请求自定义 request body,指定数据结构和示例。

from drf_spectacular.utils import OpenApiExampleclass UserCreateView(APIView):@extend_schema(request={"application/json": {"type": "object","properties": {"username": {"type": "string", "example": "Tom"},"email": {"type": "string", "example": "tom@example.com"},},}},examples=[OpenApiExample("示例请求",summary="示例 1",value={"username": "Tom", "email": "tom@example.com"},)],summary="创建用户",tags=["用户管理"],)def post(self, request):return Response({"message": "User created"})
3. 自定义响应格式

可以指定响应的格式、状态码和返回的数据结构。

from drf_spectacular.utils import OpenApiResponseclass UserDetailView(APIView):@extend_schema(responses={200: OpenApiResponse(response=UserSerializer, description="成功返回用户详情"),400: OpenApiResponse(description="请求参数错误"),},summary="获取用户详情",tags=["用户管理"],)def get(self, request):return Response({"username": "Tom", "email": "tom@example.com"})

(四)隐藏 API 端点

如果你希望某个 API 端点不出现在文档中,可以使用 exclude=True 隐藏该 API。

from drf_spectacular.utils import extend_schema@extend_schema(exclude=True)
class HiddenView(APIView):def get(self, request):return Response({"message": "This API is hidden"})

(五)总结

功能方法适用场景
修改 API 标题、描述等信息settings.py 中配置 SPECTACULAR_SETTINGS设置全局的 API 信息(如标题、版本、描述、许可证等)
修改单个视图注释使用 @extend_schema 修饰视图方法为单个视图或端点添加 summarydescriptiontags
修改多个视图注释使用 @extend_schema_view 修饰 ViewSet 或多个方法为多个视图方法批量修改 API 注释
自定义请求参数使用 OpenApiParameter 添加查询参数添加查询参数,如 qpage
自定义请求体使用 OpenApiExample 定义请求体和示例定义 POST 请求的请求体数据结构及示例
自定义响应格式使用 OpenApiResponse 定义响应格式、状态码及返回数据结构自定义响应数据结构和返回状态码
隐藏 API 端点使用 @extend_schema(exclude=True) 隐藏某个端点隐藏某些 API 端点,避免它们出现在生成的文档中

通过这些方法,您可以精确控制 drf-spectacular 生成的 OpenAPI 文档,使其符合您的需求并提升 API 可读性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词