当前位置: 首页 > news >正文

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&#xff1f; 为什么选择 Apispec&#xff1f; 安装与配置 02Apispec 的基本用法 生成简单的 API 文档 1、创建 Apispec 实例 2、定义 API 路由和视图 3、添加路径到 Apispec 集成 Flask 和 Apispec 1、安装…...

SpringBoot 自定义异常返回数据格式

Spring Boot 默认异常处理 当我们用 spring boot 开发接口是&#xff0c;当遇到异常时返回的数据格式是如下形式的 {"timestamp": "2024-07-06T02:48:55.79100:00","status": 404,"error": "Not Found","path":…...

【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!

视频演示 【xinference】&#xff08;15&#xff09;&#xff1a;在compshare上&#xff0c;使用docker-compose运行xinference和chatgpt-web项目&#xff0c;配置成功&#xff01;&#xff01;&#xff01; 1&#xff0c;安装docker方法&#xff1a; #!/bin/shdistribution$(…...

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤&#xff0c;包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码&#xff1a; 步骤1&#xff1a;设置角色的物理属性 角色通常使用Character Co…...

个人视角,社会影响力:自媒体的魅力所在

随着数字化时代的到来&#xff0c;自媒体正成为信息传播领域的一场革命。个人视角与社会影响力的结合&#xff0c;赋予了自媒体独特的魅力。在传统媒体受限制的同时&#xff0c;自媒体为每个人提供了表达自己观点和思想的自由。个体的真实视角使得自媒体在信息传播中发挥着重要…...

算法训练营day70

题目1&#xff1a;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协议网关模块&#xff08;XD-ECPNS20&#xff09;&#xff0c;不仅可以实现数据之间的通信&#xff0c;还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块&#xff08;XD-ECPNS20&#xff09;具有高速传输的特点&#xff0c;因此通…...

日志自动分析-Web---360星图GoaccessALBAnolog

目录 1、Web-360星图(IIS/Apache/Nginx) 2、Web-GoAccess &#xff08;任何自定义日志格式字符串&#xff09; 源码及使用手册 安装goaccess 使用 输出 3-Web-自写脚本&#xff08;任何自定义日志格式字符串&#xff09; 4、Web-机器语言analog&#xff08;任何自定义日…...

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展&#xff0c;笔者在学习这些内容时&#xff0c;特地整理记录下来&#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类&#xff0c;Integer和int区别是什么&#xff1f; 使用封装类的目的 对象化:…...

ssrf结合redis未授权getshell

目录 漏洞介绍 SSRF Redis未授权 利用原理 环境搭建 利用过程 rockylinux cron计划任务反弹shell 写公钥免密登录 ubuntu 写公钥免密登录 漏洞介绍 SSRF SSRF&#xff08;server side request forgrey&#xff09;服务端请求伪造&#xff0c;因后端未过滤用户输入&…...

魔法自如:精通 IPython %automagic 命令的切换艺术

魔法自如&#xff1a;精通 IPython %automagic 命令的切换艺术 在 IPython 的神奇世界里&#xff0c;魔术命令是其强大交互功能的核心。这些以 % 或 %% 开头的命令&#xff0c;能够执行一系列特殊的操作&#xff0c;从而增强用户的编程体验。但是&#xff0c;你是否知道&#…...

基于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存储数据目录&#xff1a; mkdi…...

shell-awk语法整理

shell-awk语法整理 前言基本语法内置变量1. $02. NF3. NR4. FS5. RS6. OFS7. ORS8. FILENAME9. FNR10. ARGV11. ENVIRON12. IGNORECASE13. RSTART 和 RLENGTH示例解释 内置函数循环语句&#xff08;后面的;可不加&#xff09;条件语句高级特性示例 特殊模式BEGINEND组合示例BEG…...

关于忠诚:忠于自己的良知、理想、信念

关于忠诚&#xff1a; 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事&#xff0c;会纠结离开还是留下&#xff0c;这里我们要深知忠诚的定义&#xff0c;我们不是忠诚于某个人、某件事、或者某个机构&#xff0c;而是忠诚于自己的良知&#xff0c;忠诚于自己的理想和…...

探索Linux:开源世界的无限可能

Linux是一款开源操作系统&#xff0c;它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生&#xff0c;他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下&#xff0c;Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…...

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略

什么是半监督目标检测&#xff1f; 传统机器学习根据训练数据集中的标注情况&#xff0c;有着不同的场景&#xff0c;主要包括&#xff1a;监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性&#xff0c;在介绍半监督目标检测方法之前&#xff0c;我…...

Hive 高可用分布式部署详细步骤

目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中&#xff0c;将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…...

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况&#xff0c;含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装&#xff0c;然后再去运行&#xff0c;此时可…...

GNU/Linux - wic文件的使用

Yocto/OpenEmbedded使用的磁盘镜像格式是 wic。为嵌入式系统提供 bootable images。 The disk image format used in the Yocto Project is wic. .wic 文件显然只是一个带有分区表和分区的磁盘镜像&#xff0c;就像下载 Linux 发行版时获得的所有 .img 文件一样。这就是为什么你…...

前端JS 插件实现下载【js-tool-big-box,下载大文件(fetch请求 + 下载功能版)

上一节&#xff0c;我们添加了下载大文件的纯功能版&#xff0c;意思就是需要开发者&#xff0c;在自己项目里发送请求&#xff0c;请求成功后&#xff0c;获取文件流的blob数据&#xff0c;然后 js-tool-big-box 帮助下载。 但考虑到&#xff0c;有些项目&#xff0c;可能比较…...

C语言指针核心解析与六大实战应用

1. 指针在C语言中的核心地位指针是C语言的灵魂所在&#xff0c;它直接操作内存地址的特性赋予了程序员极大的灵活性。在嵌入式开发领域&#xff0c;指针的使用频率尤其高&#xff0c;因为我们需要直接与硬件寄存器打交道&#xff0c;进行内存管理等底层操作。注意&#xff1a;指…...

嵌入式环形缓冲区:统一队列/栈/数组的零分配实现

1. 项目概述SSVQueueStackArray 是一个面向嵌入式系统的轻量级、零分配&#xff08;zero-allocation&#xff09;、编译期类型安全的环形缓冲区&#xff08;Ring Buffer&#xff09;实现库&#xff0c;专为资源受限的 MCU 环境设计。其核心目标并非提供通用容器抽象&#xff0c…...

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南

5个突破边界技巧&#xff1a;OpenSpeedy游戏变速工具深度优化指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 副标题&#xff1a;如何通过用户态Hook技术实现游戏帧率自由…...

前端CSS精讲05:Grid网格布局——现代页面最强二维布局方案

文章目录 一、什么是 Grid 布局 二、开启 Grid 三、最核心:划分行和列 1. 定义列数与宽度 2. 定义行数与高度 3. 自适应等分:fr 单位(Grid 神器) 4. 自动适应内容 四、格子之间的间距 五、对齐方式(和 Flex 很像) 1. 整个网格在容器里的位置 2. 整个网格整体对齐 六、子项…...

如何高效构建Steam游戏DRM解除自动化解决方案:开源框架技术实现

如何高效构建Steam游戏DRM解除自动化解决方案&#xff1a;开源框架技术实现 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam游戏DRM解除自动化解决方案为技术爱好者提供了一套完整…...

Flightmare性能调优指南:从卡顿到丝滑的4个突破点

Flightmare性能调优指南&#xff1a;从卡顿到丝滑的4个突破点 【免费下载链接】flightmare An Open Flexible Quadrotor Simulator 项目地址: https://gitcode.com/gh_mirrors/fl/flightmare 你是否曾遇到这样的困境&#xff1a;精心设计的四旋翼控制算法在Flightmare仿…...

Android 13多屏适配避坑指南:从LocalDisplayAdapter到LogicalDisplayMapper的屏幕识别与映射实战

Android 13多屏适配实战&#xff1a;从硬件识别到逻辑映射的完整解决方案 折叠屏设备的普及和外接显示器的广泛应用&#xff0c;让Android开发者面临前所未有的多屏适配挑战。在Android 13中&#xff0c;系统对多屏幕的支持达到了新的高度&#xff0c;但同时也带来了更复杂的适…...

3款免费MySQL客户端实测对比:DBeaver、WorkBench、HeidiSQL哪个更适合你?

三款开源MySQL客户端深度横评&#xff1a;从安装到高阶功能的全方位指南 当Navicat的收费模式成为团队协作或个人开发的负担时&#xff0c;开发者们往往需要寻找功能相当但零成本的开源替代品。本文将基于实际工程经验&#xff0c;对DBeaver、MySQL Workbench和HeidiSQL这三款主…...

基于光伏出力利用率的电动汽车充电站能量调度策略:动态评估充放电灵活性,优化准入规则与电价制定...

考虑光伏出力利用率的电动汽车充电站能量调度策略。 程序注释非常非常详细 针对间歇性能源利用的问题&#xff0c;构建电动汽车的充放电灵活度指标&#xff0c;用以评估电动汽车参与光伏充电站能量调度的能力&#xff1b; 令充电站在饥饿模式或饱和模式下运行&#xff0c;并根据…...

告别阻塞!用 PHP TrueAsync 实现 PHP 脚本提速 10 倍

proc_open 与 shell_exec 等函数不同&#xff0c;proc_open 是创建进程的丰富工具。PHP 核心甚至为它引入了特殊的"hack"来正确处理管道。管道是进程间通信的最佳方式之一&#xff0c;也是最便捷的方式。唯一更好的方案是共享内存加文件事件&#xff0c;这仅仅是因为…...