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 帮助下载。 但考虑到,有些项目,可能比较…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...