[python]在drf中使用drf_spectacular

安装drf_spectacular

文档

pypi链接:https://pypi.org/project/drf-spectacular/

文档链接:https://drf-spectacular.readthedocs.io/en/latest/readme.html

安装步骤

  1. 在环境中添加
bash 复制代码
pip install drf-spectacular
  1. 在setting的INSTALLED_APPS中添加
python 复制代码
INSTALLED_APPS = [
    # ALL YOUR APPS
    'drf_spectacular',
]
  1. 在setting的REST_FRAMEWORK中添加
python 复制代码
REST_FRAMEWORK = {
    # YOUR SETTINGS
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}
  1. 根据实机情况填写setting中的SPECTACULAR_SETTINGS,此内容为添加
python 复制代码
SPECTACULAR_SETTINGS = {
    "TITLE": "Your API",
    "DESCRIPTION": "API documentation",
    "VERSION": "1.0.0",
    # "SERVE_INCLUDE_SCHEMA": True,
    "SWAGGER_UI_DIST": "/static/swagger-ui-dist/",  # 本地静态文件路径
    "SWAGGER_UI_FAVICON_HREF": "/static/swagger-ui-dist/favicon-32x32.png",  # 本地图标路径
    "REDOC_DIST": "redoc-dist",  # 如果需要 Redoc
}
  1. url.py文件中添加
python 复制代码
urlpatterns = [
    # YOUR PATTERNS
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    # Optional UI:
    path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]

解决UI在线无法使用的问题

下载https://github.com/swagger-api/swagger-ui中的release内容

并根据第四步中的SWAGGER_UI_DIST内容,把release的dist内容放到具体的路径上.


对接口进行说明

先展示一个实例

python 复制代码
class UserViewSets(viewsets.ModelViewSet):
    queryset = user.objects.all()
    serializer_class = UserSerializers
    filter_backends = [DjangoFilterBackend, OrderingFilter]
    ordering_fields = ["id"]
    filterset_fields = ["first_name"]

    # /user/search/?username=xxx
    # /user/search/?first_name=xxx
    @extend_schema(
        description="根据工号或者姓名查找用户",
        parameters=[
            OpenApiParameter(
                name="username",
                description="员工工号",
                required=False,
                type=OpenApiTypes.STR,
                location=OpenApiParameter.QUERY,
                default="358256",
                examples=[
                    OpenApiExample(name="第一页", value=1, description="获取第一页数据"),
                    OpenApiExample(name="第五页", value=5, description="获取第五页数据"),
                ],
            ),
            OpenApiParameter(
                name="first_name",
                description="员工姓名",
                required=False,
                type=OpenApiTypes.STR,
                location=OpenApiParameter.QUERY,
                default="谢斯",
            ),
        ],
        summary="用户详情接口",
    )
    @action(detail=False, methods=["get"], url_path="search")
    def search(self, request):
        username = request.query_params.get("username", None)
        first_name = request.query_params.get("first_name", None)
        queryset = self.get_queryset()
        if username:
            queryset = queryset.filter(username=username)
        if first_name:
            queryset = queryset.filter(first_name=first_name)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

需要注意的点

在view.py文件中需要引入对应的内容

python 复制代码
from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes, OpenApiExample

介绍SPECTACULAR_SETTINGS

配置项 类型 默认值 描述
基础配置
TITLE str "API" API 文档的标题。
DESCRIPTION str "" API 文档的描述(Markdown 支持)。
VERSION str "1.0.0" API 的版本号。
SERVE_URLCONF str 当前 urls.py 定义用于生成文档的 URL 配置。
SERVE_PATH str "/schema/" OpenAPI Schema 的访问路径。
SERVE_INCLUDE_SCHEMA bool True 是否在 Swagger 页面中显示 Schema 链接。
接口过滤与路径匹配
配置项 类型 默认值 描述
SCHEMA_PATH_PREFIX str r"^api/" 匹配生成文档的 URL 路径(正则表达式)。
SCHEMA_PATH_PREFIX_TRIM bool False 是否移除路径前缀(如 /api/)以简化文档路径。
SCHEMA_COERCE_PATH_PK bool False 将路径中的 pk 强制转换为整数类型。
SCHEMA_URL_PREFIX str "" 为所有接口路径添加前缀(如 /v1/)。
认证与安全策略
AUTHENTICATION_CLASSES list 项目默认的 REST_FRAMEWORK.AUTHENTICATION_CLASSES 指定需要包含在文档中的认证类(如 JWT, Token)。
SECURITY_DEFINITIONS dict {} 定义安全策略(如 OAuth2、JWT)。
SECURITY_REQUIREMENTS list [] 指定默认的安全要求(如 ["BearerAuth"])。
组件与扩展
COMPONENT_SPLIT_REQUEST bool False 是否将请求和响应拆分为独立的组件(适用于复杂场景)。
ENUM_NAME_OVERRIDES dict {} 覆盖枚举字段的名称(如 ChoiceField)。
TAGS list 从视图中自动提取 手动定义接口标签(分组)。
PREPROCESSING_HOOKS list [] 在生成 Schema 前自定义处理函数(如修改参数)。
POSTPROCESSING_HOOKS list [] 在生成 Schema 后自定义处理函数(如添加注释)。
UI 显示优化
SWAGGER_UI_SETTINGS dict {} 自定义 Swagger UI 的行为(如主题、操作排序)。
REDOC_SETTINGS dict {} 自定义 ReDoc 的行为(如样式、操作排序)。
SERVE_PUBLIC bool True 是否允许匿名用户访问文档页面。
高级配置
APPEND_COMPONENTS dict {} 手动添加 OpenAPI 组件(如自定义请求体格式)。
POSTPROCESSING_FILTER callable None 对生成的 Schema 进行过滤或修改。
EXTENSIONS dict {} 注册自定义扩展(如支持 GraphQL)。
相关推荐
梨落秋霜2 小时前
Python入门篇【文件处理】
android·java·python
Java 码农2 小时前
RabbitMQ集群部署方案及配置指南03
java·python·rabbitmq
张登杰踩3 小时前
VIA标注格式转Labelme标注格式
python
Learner4 小时前
Python数据类型(四):字典
python
odoo中国4 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
Jelena157795857924 小时前
Java爬虫api接口测试
python
踩坑记录5 小时前
leetcode hot100 3.无重复字符的最长子串 medium 滑动窗口(双指针)
python·leetcode
诸神缄默不语7 小时前
Python处理Word文档完全指南:从基础到进阶
python
海棠AI实验室7 小时前
第四章 项目目录结构:src/、configs/、data/、tests/ 的黄金布局
python·项目目录结构
爱笑的眼睛118 小时前
超越可视化:降维算法组件的深度解析与工程实践
java·人工智能·python·ai