Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库
目录
01什么是 Apispec?
为什么选择 Apispec?
安装与配置
02Apispec 的基本用法
生成简单的 API 文档
1、创建 Apispec 实例
2、定义 API 路由和视图
3、添加路径到 Apispec
集成 Flask 和 Apispec
1、安装 Flask 和 Flask-Apispec
2、创建 Flask 应用
集成 Django 和 Apispec
1、安装 Django 和 Django-Rest-Framework
2、创建 Django 项目和应用
3、配置 Django 项目
4、定义 Django 视图
5、配置 URL
6、生成 OpenAPI 规范
03Apispec 的高级功能
1. 自定义生成器
2. 支持多种框架
3. 自动生成接口文档
4. 与第三方工具集成
04实战案例
1. 项目简介
2. 项目结构
3. 安装依赖
4. 定义模型
5. 定义视图和序列化
6. 定义主应用
7. 运行应用并查看文档
访问 http://localhost:5000/swagger/ 查看生成的 API 文档。
05最佳实践
06小结

01什么是 Apispec?
Apispec 简介
Apispec 是一个用于生成 OpenAPI(Swagger)规范的 Python 库。它能够帮助开发者自动生成和维护 API 文档,提供直观、详细的接口说明。通过 Apispec,我们可以轻松地将 Python 函数或类的文档字符串转换为符合 OpenAPI 规范的文档,减少手动编写文档的麻烦。
为什么选择 Apispec?
-
简洁易用:Apispec 提供了简单易用的 API,让你可以快速上手。
-
灵活强大:支持多种框架(如 Flask、Django)和扩展,让你可以根据需要定制化文档生成。
-
自动化:通过自动生成和更新文档,减少手动操作和维护成本。
安装与配置
在开始使用 Apispec 之前,我们需要先进行安装。你可以使用 pip 进行安装:
pip install apispec
Github 项目地址:
https://github.com/marshmallow-code/apispec
02Apispec 的基本用法
让我们通过几个简单的例子来看看 Apispec 的基本用法。
生成简单的 API 文档
1、创建 Apispec 实例
from apispec import APISpecspec = APISpec(title="My API",version="1.0.0",openapi_version="3.0.0",info=dict(description="This is a sample API"),
)
2、定义 API 路由和视图
def get_user(user_id):"""---get:description: Get a user by IDparameters:- name: user_idin: pathrequired: trueschema:type: integerresponses:200:description: A user objectcontent:application/json:schema:type: objectproperties:id:type: integername:type: string"""return {"id": user_id, "name": "John Doe"}
3、添加路径到 Apispec
spec.path(path="/users/{user_id}",operations=dict(get=dict(description="Get a user by ID",parameters=[{"name": "user_id","in": "path","required": True,"schema": {"type": "integer"},}],responses={"200": {"description": "A user object","content": {"application/json": {"schema": {"type": "object","properties": {"id": {"type": "integer"},"name": {"type": "string"},},}}},}},)),
)
集成 Flask 和 Apispec
1、安装 Flask 和 Flask-Apispec
pip install Flask Flask-Apispec
2、创建 Flask 应用
from flask import Flask, jsonify
from flask_apispec import FlaskApiSpec, doc, marshal_with
from flask_apispec.views import MethodResource
from marshmallow import Schema, fieldsapp = Flask(__name__)class UserSchema(Schema):id = fields.Int()name = fields.Str()class UserResource(MethodResource):@doc(description='Get a user by ID', tags=['User'])@marshal_with(UserSchema)def get(self, user_id):return {"id": user_id, "name": "John Doe"}app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
docs = FlaskApiSpec(app)
docs.register(UserResource)@app.route('/swagger/')
def swagger_ui():return jsonify(docs.spec.to_dict())if __name__ == '__main__':app.run()
集成 Django 和 Apispec
1、安装 Django 和 Django-Rest-Framework
pip install django djangorestframework
2、创建 Django 项目和应用
django-admin startproject myproject
cd myproject
django-admin startapp myapp
3、配置 Django 项目
在 settings.py 中添加 rest_framework 和 apispec:
INSTALLED_APPS = [...'rest_framework','myapp','apispec',
]
4、定义 Django 视图
在 myapp/views.py 中:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.schemas import AutoSchemaclass UserView(APIView):schema = AutoSchema(manual_fields=[coreapi.Field('user_id', required=True, location='path', schema={'type': 'integer'})])def get(self, request, user_id):"""Get a user by ID.---responses:200:description: A user objectcontent:application/json:schema:type: objectproperties:id:type: integername:type: string"""return Response({"id": user_id, "name": "John Doe"})
5、配置 URL
在 myapp/urls.py 中:
from django.urls import path
from .views import UserViewurlpatterns = [path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
]
6、生成 OpenAPI 规范
在 manage.py 中:
from apispec import APISpec
from rest_framework.schemas import get_schema_viewspec = APISpec(title="My API",version="1.0.0",openapi_version="3.0.0",
)schema_view = get_schema_view(title="My API")
schema = schema_view.get_schema(request=None, public=True)
spec.components.schema('User', schema)
spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])print(spec.to_yaml())
03Apispec 的高级功能
1. 自定义生成器
Apispec 提供了灵活的扩展机制,允许你自定义生成器。你可以通过继承和扩展 Apispec 提供的基类,实现自己的生成逻辑。
from apispec import BasePluginclass MyPlugin(BasePlugin):def path_helper(self, operations, *, resource, **kwargs):operations.update({'get': {'description': 'Get a user by ID','parameters': [{'name': 'user_id', 'in': 'path', 'required': True, 'schema': {'type': 'integer'}}],'responses': {'200': {'description': 'A user object','content': {'application/json': {'schema': {'type': 'object','properties': {'id': {'type': 'integer'},'name': {'type': 'string'}}}}}}}}})spec = APISpec(title="My API",version="1.0.0",openapi_version="3.0.0",plugins=[MyPlugin()],
)
2. 支持多种框架
Apispec 支持多种流行的 Python 框架,如 Flask、Django、Falcon 等。你可以根据需要选择合适的框架和插件,快速生成 API 文档。
3. 自动生成接口文档
Apispec 可以根据函数或类的文档字符串,自动生成接口文档,减少手动编写文档的工作量。
def get_user(user_id):"""---get:description: Get a user by IDparameters:- name: user_idin: pathrequired: trueschema:type: integerresponses:200:description: A user objectcontent:application/json:schema:type: objectproperties:id:type: integername:type: string"""return {"id": user_id, "name": "John Doe"}
4. 与第三方工具集成
Apispec 可以与许多第三方工具集成,如 Swagger UI、ReDoc 等,提供直观的接口文档展示和测试功能。
from flask import Flask, jsonify
from flask_apispec import FlaskApiSpecapp = Flask(__name__)@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):"""---get:description: Get a user by IDparameters:- name: user_idin: pathrequired: trueschema:type: integerresponses:200:description: A user objectcontent:application/json:schema:type: objectproperties:id:type: integername:type: string"""return jsonify({"id": user_id, "name": "John Doe"})docs = FlaskApiSpec(app)
docs.register(get_user)if __name__ == '__main__':app.run()
04实战案例
构建一个完整的 API 文档系统
1. 项目简介
假设我们有一个简单的用户管理系统,需要为其 API 编写文档。我们的 API 包括用户的增删改查操作,以及一些基础的身份验证功能。
2. 项目结构
user_management/
├── app.py
├── models.py
├── views.py
├── serializers.py
└── requirements.txt
3. 安装依赖
在 requirements.txt 中添加依赖:
Flask
Flask-RESTful
Flask-SQLAlchemy
Flask-Migrate
apispec
flask-apispec
运行以下命令安装依赖:
pip install -r requirements.txt
4. 定义模型
在 models.py 中定义用户模型:
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)
5. 定义视图和序列化
在 serializers.py 中定义用户序列化器:
from marshmallow import Schema, fieldsclass UserSchema(Schema):id = fields.Int(dump_only=True)name = fields.Str(required=True)email = fields.Email(required=True)
在 views.py 中定义视图:
from flask import request
from flask_restful import Resource
from models import User, db
from serializers import UserSchemaclass UserResource(Resource):def get(self, user_id):user = User.query.get_or_404(user_id)schema = UserSchema()return schema.dump(user)def post(self):schema = UserSchema()user = schema.load(request.json)db.session.add(user)db.session.commit()return schema.dump(user), 201def put(self, user_id):user = User.query.get_or_404(user_id)schema = UserSchema(partial=True)updated_user = schema.load(request.json, instance=user)db.session.commit()return schema.dump(updated_user)def delete(self, user_id):user = User.query.get_or_404(user_id)db.session.delete(user)db.session.commit()return '', 204
6. 定义主应用
在 app.py 中:
from flask import Flask
from flask_restful import Api
from flask_migrate import Migrate
from models import db
from views import UserResource
from flask_apispec import FlaskApiSpec
from flask_apispec.extension import FlaskApiSpecapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db.init_app(app)
migrate = Migrate(app, db)
api = Api(app)api.add_resource(UserResource, '/users/<int:user_id>')docs = FlaskApiSpec(app)
docs.register(UserResource)if __name__ == '__main__':app.run()
7. 运行应用并查看文档
运行以下命令启动应用:
python app.py
访问 http://localhost:5000/swagger/ 查看生成的 API 文档。
05最佳实践
1. 保持文档与代码同步
确保文档始终与代码保持同步,避免出现文档与实际 API 不一致的情况。你可以使用 CI/CD 工具自动生成和部署文档。
2. 使用注释和装饰器
通过使用注释和装饰器,可以让文档生成更加简洁、易读。例如,使用 Flask-Apispec 的 @doc 装饰器为视图函数添加文档信息。
3. 定义全局参数和响应
对于常用的参数和响应,可以在 Apispec 中定义全局参数和响应模板,减少重复代码。
spec.components.parameter("user_id", "path", schema={"type": "integer"}, required=True)
spec.components.response("User", {"description": "A user object","content": {"application/json": {"schema": {"type": "object","properties": {"id": {"type": "integer"},"name": {"type": "string"}}}}}
})
4. 定期审查和更新文档
定期审查和更新文档,确保文档的准确性和完整性。可以通过设置文档审查周期或引入文档审查流程来实现。
更多功能、详细用法可参考官方文档:
https://apispec.readthedocs.io/en/latest
06小结
通过这篇文章,相信你已经对 Apispec 有了基本的了解和掌握。我们从基本用法到高级功能,再到实战案例和最佳实践,全面地介绍了如何使用 Apispec 生成和维护 API 文档。
希望你能将这些知识应用到实际项目中,为你的 API 增加一抹亮色。

相关文章:
Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库
目录 01什么是 Apispec? 为什么选择 Apispec? 安装与配置 02Apispec 的基本用法 生成简单的 API 文档 1、创建 Apispec 实例 2、定义 API 路由和视图 3、添加路径到 Apispec 集成 Flask 和 Apispec 1、安装…...
SpringBoot 自定义异常返回数据格式
Spring Boot 默认异常处理 当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的 {"timestamp": "2024-07-06T02:48:55.79100:00","status": 404,"error": "Not Found","path":…...
【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!
视频演示 【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!! 1,安装docker方法: #!/bin/shdistribution$(…...
【Unity 3D角色移动】
【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…...
个人视角,社会影响力:自媒体的魅力所在
随着数字化时代的到来,自媒体正成为信息传播领域的一场革命。个人视角与社会影响力的结合,赋予了自媒体独特的魅力。在传统媒体受限制的同时,自媒体为每个人提供了表达自己观点和思想的自由。个体的真实视角使得自媒体在信息传播中发挥着重要…...
算法训练营day70
题目1:108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…...
EtherCAT转Profinet网关配置说明第二讲:上位机软件配置
EtherCAT协议转Profinet协议网关模块(XD-ECPNS20),不仅可以实现数据之间的通信,还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块(XD-ECPNS20)具有高速传输的特点,因此通…...
日志自动分析-Web---360星图GoaccessALBAnolog
目录 1、Web-360星图(IIS/Apache/Nginx) 2、Web-GoAccess (任何自定义日志格式字符串) 源码及使用手册 安装goaccess 使用 输出 3-Web-自写脚本(任何自定义日志格式字符串) 4、Web-机器语言analog(任何自定义日…...
【面试八股文】java基础知识
引言 本文是java面试时的一些常见知识点总结归纳和一些拓展,笔者在学习这些内容时,特地整理记录下来,以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类,Integer和int区别是什么? 使用封装类的目的 对象化:…...
ssrf结合redis未授权getshell
目录 漏洞介绍 SSRF Redis未授权 利用原理 环境搭建 利用过程 rockylinux cron计划任务反弹shell 写公钥免密登录 ubuntu 写公钥免密登录 漏洞介绍 SSRF SSRF(server side request forgrey)服务端请求伪造,因后端未过滤用户输入&…...
魔法自如:精通 IPython %automagic 命令的切换艺术
魔法自如:精通 IPython %automagic 命令的切换艺术 在 IPython 的神奇世界里,魔术命令是其强大交互功能的核心。这些以 % 或 %% 开头的命令,能够执行一系列特殊的操作,从而增强用户的编程体验。但是,你是否知道&#…...
基于CentOS Stream 9平台搭建MinIO以及开机自启
1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录: mkdi…...
shell-awk语法整理
shell-awk语法整理 前言基本语法内置变量1. $02. NF3. NR4. FS5. RS6. OFS7. ORS8. FILENAME9. FNR10. ARGV11. ENVIRON12. IGNORECASE13. RSTART 和 RLENGTH示例解释 内置函数循环语句(后面的;可不加)条件语句高级特性示例 特殊模式BEGINEND组合示例BEG…...
关于忠诚:忠于自己的良知、理想、信念
关于忠诚: 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事,会纠结离开还是留下,这里我们要深知忠诚的定义,我们不是忠诚于某个人、某件事、或者某个机构,而是忠诚于自己的良知,忠诚于自己的理想和…...
探索Linux:开源世界的无限可能
Linux是一款开源操作系统,它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生,他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下,Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…...
深度学习之半监督学习:一文梳理目标检测中的半监督学习策略
什么是半监督目标检测? 传统机器学习根据训练数据集中的标注情况,有着不同的场景,主要包括:监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性,在介绍半监督目标检测方法之前,我…...
Hive 高可用分布式部署详细步骤
目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中,将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…...
ubuntu下运行程序时提示缺库问题的有效解决方法
目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况,含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装,然后再去运行,此时可…...
GNU/Linux - wic文件的使用
Yocto/OpenEmbedded使用的磁盘镜像格式是 wic。为嵌入式系统提供 bootable images。 The disk image format used in the Yocto Project is wic. .wic 文件显然只是一个带有分区表和分区的磁盘镜像,就像下载 Linux 发行版时获得的所有 .img 文件一样。这就是为什么你…...
前端JS 插件实现下载【js-tool-big-box,下载大文件(fetch请求 + 下载功能版)
上一节,我们添加了下载大文件的纯功能版,意思就是需要开发者,在自己项目里发送请求,请求成功后,获取文件流的blob数据,然后 js-tool-big-box 帮助下载。 但考虑到,有些项目,可能比较…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
