一、前言

概述

在前后端分离开发中,API 文档的重要性不言而喻。Swagger(现更名为 OpenAPI)作为主流的 API 文档生成工具,能自动生成交互式文档,极大提升开发效率。本文将介绍两种在 Django 项目中集成 Swagger 的实用方案,帮助开发者快速搭建完善的 API 文档系统。

什么是 Swagger/OpenAPI?

Swagger 是一套用于描述、生成、消费和可视化 RESTful API 的规范和工具集,目前已演进为 OpenAPI 规范:

  • Swagger 2.0:支持 WebSockets、OAuth2、文件上传等功能,提升了 API 描述的精确度
  • OpenAPI 3.0:下一代规范,提供更严格的模式验证、更多数据类型支持和更好的扩展性

通过集成 Swagger,开发者可以获得:

  • 自动生成的交互式 API 文档
  • 在线接口调试功能
  • 标准化的 API 描述格式(JSON/YAML)
  • 便于前后端协作和 API 版本管理

两种方案对比

特性 drf-yasg drf-spectacular
规范支持 Swagger 2.0 OpenAPI 3.0
功能丰富度 基础功能完善 高级功能更丰富
可定制性 中等
学习曲线 平缓 稍陡
推荐场景 简单项目快速集成 复杂项目、需要高级定制

二、方案一:使用 drf-yasg(支持 Swagger 2.0)

工具介绍

drf-yasg 是基于 Django REST Framework (DRF) 的 API 文档生成工具,专注于 Swagger 2.0 规范,具有以下特点:

  • 动态生成 Swagger UI,支持多种主题
  • 可自定义文档样式和内容
  • 支持隐藏指定字段、添加额外参数等高级功能

安装步骤

安装

pip install -U drf-yasg

配置settings.py:在 INSTALLED_APPS 中添加相关应用

INSTALLED_APPS = [
# ...
'django.contrib.staticfiles', # 用于提供 Swagger UI 的静态文件
'drf_yasg',
# ...
]

配置urls.py:添加 Swagger 相关路由

from django.urls import re_path
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi # 配置 API 文档基本信息
schema_view = get_schema_view(
openapi.Info(
title="项目 API",
default_version='v1',
description="API 接口文档描述",
terms_of_service="https://www.example.com/terms/",
contact=openapi.Contact(email="contact@example.com"),
license=openapi.License(name="MIT License"),
),
public=True,
permission_classes=(permissions.AllowAny,), # 允许任何人访问文档
) # 添加 URL 路由
urlpatterns = [
# ...
# 文档 JSON/YAML 下载
path('swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'),
# Swagger UI 页面
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
# ReDoc 页面
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
# ...
]

查看效果

启动 Django 项目后,通过以下地址访问文档:

  • Swagger UI 界面:http://localhost:8000/swagger/

  • ReDoc 界面:http://localhost:8000/redoc/
  • 下载 JSON 格式文档:http://localhost:8000/swagger.json
  • 下载 YAML 格式文档:http://localhost:8000/swagger.yaml

三、方案二:使用 drf-spectacular(支持 OpenAPI 3.0)

工具介绍

drf-spectacular 是新一代 API 文档生成工具,支持 OpenAPI 3.0 规范,具有以下优势:

  • 更强的可扩展性和可定制性
  • 支持客户端代码生成
  • 兼容多种 DRF 插件
  • 提供更丰富的文档装饰器

参考资料: drf-spectacular 官方文档

安装步骤

安装

pip install drf-spectacular
pip install drf-spectacular[sidecar] # 安装内置 UI 资源(推荐)

配置 settings.py:点击查看完整代码

INSTALLED_APPS = [
# ...
'drf_spectacular',
'drf_spectacular_sidecar', # 内置 UI 资源
# ...
] # 配置 DRF
REST_FRAMEWORK = {
# OpenAPI 文档
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
} ### drf-spectacular OpenAPI 文档配置
SPECTACULAR_SETTINGS = {
"SWAGGER_UI_DIST": "SIDECAR", # 使用内置 UI
"SWAGGER_UI_FAVICON_HREF": "SIDECAR",
"TITLE": "MarsMgn API",
"DESCRIPTION": "火星信息平台接口文档",
"VERSION": "1.0.0",
"SERVE_INCLUDE_SCHEMA": False, # 不在文档中包含 schema 本身
}

配置 urls.py:点击查看完整代码

from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView

urlpatterns = [
#...
# API schema 生成端点
path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
# Swagger UI 界面
path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
# ReDoc 界面
path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
#...
]

查看效果

启动 Django 项目后,通过以下地址访问 Swagger UI 界面:http://127.0.0.1:8000/api/schema/swagger-ui

四、drf-spectacular 高级使用技巧

字段注释

文档描述优先从序列化器 / 模型的 help_text 提取:

class SystemPost(models.Model):
id = models.BigAutoField(primary_key=True, help_text="岗位ID")
code = models.CharField(
max_length=64,
help_text="岗位编码", # 会显示在文档中
)

接口说明

使用 @extend_schema 装饰器自定义接口描述:

from drf_spectacular.utils import extend_schema

@extend_schema(summary="创建岗位", description="自定义接口详细说明")
@action(methods=["post"], detail=False, url_path="create")
def create_post(self, request, *args, **kwargs):
return self.custom_create(request, *args, **kwargs)

接口分组

通过 tags 参数对接口进行分组:

@extend_schema(tags=["管理后台-system-岗位"])
class PostViewSet(CustomViewSet):
queryset = SystemPost.objects.all()
filterset_class = SystemPostFilter

请求与响应参数定义

定义响应参数示例

from drf_spectacular.utils import extend_schema, OpenApiResponse
from drf_spectacular.types import OpenApiTypes @extend_schema(
responses={
200: OpenApiResponse(
description="操作成功",
response={
"type": "object",
"properties": {
"code": {"type": "integer", "example": 0},
"data": {"type": "boolean", "example": True},
"msg": {"type": "string", "example": ""}
}
}
)
}
)
def delete_post(self, request, *args, ​**kwargs):
"""删除岗位"""
return Response({"code": 0, "data": True, "msg": ""}, status=200)

您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

Django集成Swagger全指南:两种实现方案详解的更多相关文章

  1. servlet两种配置方法详解

     1.web.xml中Servlet的注解 <servlet> <!-- servlet的内部名称,自定义 --> <servlet-name>DemoAction ...

  2. iOS同一项目多个Target的快速实现方法 - 两种使用场景详解

    我们项目中,默认建好是只有一个target的,但是,一些场景中,多target能帮助我们更好的使用项目. 场景1: 同一项目,一般会分不同环境:开发环境.测试环境.正式(生产)环境. 这就涉及到一个请 ...

  3. python模块的导入的两种方式区别详解

    Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...

  4. Android四大组件之服务的两种启动方式详解

    Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...

  5. Spark的两种核心Shuffle详解

    在 MapReduce 框架中, Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁, Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中.由于 Shuffle 涉 ...

  6. apache两种工作模式详解

    prefork模式 这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请 ...

  7. UEFI与 Legacy BIOS两种启动模式详解

    (1). UEFI启动模式 与 legacy启动模式 legacy启动模式: 就是这么多年来PC一直在使用的启动方式(从MBR中加载启动程序),UEFI BIOS作为一种新的BIOS自然也应该兼容这种 ...

  8. JavaScript中数组的两种排序方法详解(冒泡排序和选择排序)

    一.冒泡排序的原理(从小到大) 相邻两个数进行比较,如果前一个数大于后一个数,那么就交换,否则不交换 原理剖析 比如有一组含有6个数字的数:5.3.7.2.1.6一共6个数字,做5次循环,每次循环相邻 ...

  9. DJango中开启事务的两种方式

    目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...

  10. k8s的两种网络方案与多种工作模式[flannel与calico]

    k8s的两种网络方案与多种工作模式 1. Flannel: flannel有三种工作模式: 1. vxlan(隧道方案) 2. host-gw(路由方案) 2. udp(在用户态实现的数据封装解封装, ...

随机推荐

  1. Java编程--接口(interface)简单用法(一)

    接口是Java中的一个重要的概念. interface:定义了子类要实现的功能.由全局常量和抽象方法组成. 接口的定义 定义一个简单的interface public interface A {  p ...

  2. mysql8.0.16 设置远程主机访问

    新版的的mysql版本已经将创建账户和赋予权限的方式分开了 1.创建账户 create user 'root'@'%' identified by '123456'; 注意密码是否符合要求,我用的阿里 ...

  3. 工具 | Hacking

    0x00 简介 Hacking是一款包含多种渗透测试功能的脚本. 下载地址: Hacking下载:Hacking下载 0x01 功能说明 Brute Force DDos Attack NMap Po ...

  4. 漏洞预警 | CraftCMS模板注入漏洞

    0x00 漏洞编号 CVE-2024-56145 0x01 危险等级 高危 0x02 漏洞概述 CraftCMS是一个灵活的.易于使用的内容管理系统. 0x03 漏洞详情 CVE-2024-56145 ...

  5. DeepWiki:AI驱动、免费且实用的 GitHub 源码阅读与分析神器!

    前言 GitHub 作为全球最大的代码托管平台,汇聚了无数开发者的智慧结晶,为各行各业的技术进步提供了宝贵的资源.然而,面对浩瀚如海的代码库,如何高效地阅读.理解和分析源码,成为了摆在众多开发者面前的 ...

  6. 操作系统综合题之“用记录型信号量机制的wait操作和signal操作写出三个进程的同步代码(水果进箱问题-代码补充)”

    1.问题:假设一个水果赛选系统由三个进程A.B.C组成.进程A每次取一个水果,之后存放在货架F上,F的容量为每次只能存放一个水果.若货架上存放的是苹果则让进程B取出,并存放到苹果箱中:若货架上存放的是 ...

  7. 堆叠、MLAG、VPC、VSS 技术对比及架构建议

    堆叠.MLAG.VPC.VSS 技术对比及架构建议 1. 堆叠(Stacking) 技术实现: 多台物理设备通过专用堆叠线缆(如华为的Stack.华三IRF.思科StackWise)或普通光纤/以太网 ...

  8. 基于PySyft与TensorFlow的医疗数据协同分析系统实现教程

    1. 引言:医疗数据协同分析的挑战与机遇 在医疗信息化进程中,数据孤岛问题日益突出.各医疗机构积累的海量医疗数据受限于隐私法规(如HIPAA.GDPR)无法直接共享,形成数据壁垒.联邦学习技术的出现为 ...

  9. Data Preparation in Pandas

    Data Preparation in Pandas Data cleaning import pandas as pd import numpy as np string_data=pd.Serie ...

  10. mp4文件下载,而不是在线播放

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...