lty/qy_lty/common/swagger_utils.py
2026-03-17 13:17:02 +08:00

146 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import serializers
# 通用响应Schema
class SuccessResponseSchema(serializers.Serializer):
"""通用成功响应"""
status = serializers.CharField(help_text="操作状态,成功为'success'")
code = serializers.IntegerField(help_text="状态码成功为200")
message = serializers.CharField(help_text="操作结果信息")
class DataResponseSchema(serializers.Serializer):
"""带数据的成功响应"""
status = serializers.CharField(help_text="操作状态,成功为'success'")
code = serializers.IntegerField(help_text="状态码成功为200")
data = serializers.JSONField(help_text="返回数据")
class ErrorResponseSchema(serializers.Serializer):
"""错误响应"""
error = serializers.CharField(help_text="错误信息")
class Meta:
ref_name = "CommonErrorResponse"
class PaginatedResponseSchema(serializers.Serializer):
"""分页响应"""
count = serializers.IntegerField(help_text="总数据量")
next = serializers.URLField(help_text="下一页URL", allow_null=True)
previous = serializers.URLField(help_text="上一页URL", allow_null=True)
results = serializers.ListField(help_text="当前页数据")
# 标准化的API响应Schema新增
class StandardizedResponseSchema(serializers.Serializer):
"""标准化API响应结构"""
success = serializers.BooleanField(help_text="操作是否成功")
code = serializers.IntegerField(help_text="状态码")
message = serializers.CharField(help_text="操作结果信息", required=False, allow_null=True)
data = serializers.JSONField(help_text="返回数据", required=False, allow_null=True)
class Meta:
ref_name = "StandardizedResponse"
# 标准化的API响应生成工具
def get_standardized_response_schema(data_schema=None):
"""
获取标准化的API响应Schema
Args:
data_schema: 数据字段的Schema类
Returns:
openapi.Schema: 标准化的响应Schema
"""
properties = {
'success': openapi.Schema(type=openapi.TYPE_BOOLEAN, description='操作是否成功'),
'code': openapi.Schema(type=openapi.TYPE_INTEGER, description='状态码'),
'message': openapi.Schema(type=openapi.TYPE_STRING, description='操作结果信息')
}
if data_schema:
properties['data'] = data_schema
return openapi.Schema(
type=openapi.TYPE_OBJECT,
properties=properties
)
# 通用认证和错误响应
common_responses = {
400: openapi.Response('请求参数错误', ErrorResponseSchema),
401: openapi.Response('认证失败', openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'detail': openapi.Schema(type=openapi.TYPE_STRING, description='认证失败信息')
}
)),
403: openapi.Response('权限不足', openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'detail': openapi.Schema(type=openapi.TYPE_STRING, description='权限错误信息')
}
))
}
# 快速生成 Swagger 文档的装饰器
def swagger_schema(request_schema=None, responses=None, operation_description="", tags=None, methods=None,
manual_parameters=None, security=None, operation_id=None, query_serializer=None):
"""
快速生成 Swagger 文档的装饰器,简化 swagger_auto_schema 的使用
参数:
request_schema (serializers.Serializer): 请求体 Schema
responses (dict): 响应 Schema 字典
operation_description (str): 操作描述
tags (list): 标签列表
methods (list): 支持的方法列表,用于装饰 ViewSet 方法
manual_parameters (list): 手动参数列表
security (list): 认证设置
operation_id (str): 操作 ID
query_serializer (serializers.Serializer): 查询参数 Schema
示例:
@swagger_schema(
request_schema=MyRequestSchema,
responses={200: MyResponseSchema},
operation_description="接口描述",
tags=['标签'],
security=[{'Bearer': []}]
)
"""
# 合并默认错误响应
if responses:
merged_responses = {**common_responses}
for status_code, response in responses.items():
merged_responses[status_code] = response
else:
merged_responses = common_responses
# 构建参数
kwargs = {
'responses': merged_responses,
'operation_description': operation_description
}
if request_schema:
kwargs['request_body'] = request_schema
if tags:
kwargs['tags'] = tags
if manual_parameters:
kwargs['manual_parameters'] = manual_parameters
if security:
kwargs['security'] = security
if operation_id:
kwargs['operation_id'] = operation_id
if query_serializer:
kwargs['query_serializer'] = query_serializer
if methods:
return swagger_auto_schema(methods=methods, **kwargs)
else:
return swagger_auto_schema(**kwargs)