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

发布于:2025-03-16 ⋅ 阅读:(13) ⋅ 点赞:(0)

总结:在 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 Response

class 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 = CustomUserSerializer
    permission_classes = [AllowAny]

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

1. 自定义查询参数

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

from drf_spectacular.utils import OpenApiParameter

class 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 OpenApiExample

class 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 OpenApiResponse

class 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 可读性。


网站公告

今日签到

点亮在社区的每一天
去签到