记一次:Python的学习笔记五(Django集成swagger)

上一篇集成在了gatway上了,但给别人使用swagger的时候还是没有文档,如何集成swagger呢?

python版本:Python 3.11.5

Django版本:4.2.7

0、Swagger 文档介绍

Swagger 是一种用于 RESTful API 的开源框架,可以帮助开发者快速构建和文档化 API。Swagger 文档提供了一种自动生成和可视化 API 文档的方式,使得 API 的设计和使用更加简单和易懂。Swagger 文档通过描述 API 的路径、参数、请求体、响应和错误码等信息,让开发者可以快速了解 API 的设计和使用方式,方便开发者进行 API 的集成和调用。

Swagger 2.0 是 Swagger 规范的第二个版本,引入了许多新的功能和改进。与第一个版本相比,Swagger 2.0 添加了对 WebSockets、OAuth2、文件上传和下载等功能的支持,并且提高了描述 API 的精确度和可读性。Swagger 2.0 还提供了一种可扩展的方式,让开发者可以为自己的 API 添加自定义的元数据信息。

OpenAPI 3.0 是 Swagger 的下一代规范,为 RESTful API 提供了一种标准的描述和交互方式。与 Swagger 2.0 相比,OpenAPI 3.0 提供了更严格的模式验证和错误处理,支持更多的数据类型和协议,同时还提供了更好的安全性和可扩展性。OpenAPI 3.0 还提供了更好的分层描述方式,让开发者可以更好地组织和管理 API 的文档。

那么我们怎么在 Django 项目中集成 Swagger 功能呢?我介绍两个工具 drf-yasg 和 drf-spectacular。

1、drf-yasgdrf-spectacular介绍

drf-yasg 介绍

https://github.com/axnsan12/drf-yasg

drf-yasg 也是一个基于 DRF 的 API 文档生成工具,同样支持 Swagger 2.0规范,并提供了自动生成文档和交互式文档页面的功能。它的特点是支持动态生成 Swagger UI,支持多种主题,可以自定义 API 文档样式,同时也提供了一些有用的功能,比如支持在文档中隐藏指定字段、支持在文档中添加额外的参数等。

drf-spectacular介绍

https://github.com/tfranzel/drf-spectacular

drf-spectacular 是一个基于 DRF 的 API 文档生成工具,支持 OpenAPI 3.0规范,并提供了自动生成文档和交互式文档页面的功能。它支持自定义的扩展和重载,可以满足不同项目的需求,同时还提供了一些有用的功能,比如支持通过代码自动注册 API 视图、支持自定义请求和响应验证器等。

2、使用drf-spectacular 自动生成 OpenAPI 3.0 文档

如果新使用的是 OpenAPI 3.0 的文档,那么只能采用的是 drf-spectacular。

Drf-spectacular源码路径:GitHub - tfranzel/drf-spectacular: Sane and flexible OpenAPI 3 schema generation for Django REST framework.

版本信息查看,符合我的版本要求

大体安装流程

2.1安装 drf-spectacula

pip install drf-spectacular

2.2 在 settings.py 中配置

配置安装程序

INSTALLED_APPS = [# ALL YOUR APPS'drf_spectacular',
]

在settings.py最下面注册到 DRF Django Rest Framework=>配置DRF默认schema

REST_FRAMEWORK = {# YOUR SETTINGS'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

还是在settings.py最下面,自定义OpenApi 描述

SPECTACULAR_SETTINGS = {'TITLE': 'Your Project API','DESCRIPTION': 'Your project description','VERSION': '1.0.0','SERVE_INCLUDE_SCHEMA': False,# OTHER SETTINGS
}

2.3静态资源引入

drf-spectacular 默认不包含UI资源,采用CDN方式引入网络外部资源,如果需要本地使用UI资源,可以按照一下方式引入:

安装ui命令:

 pip install drf-spectacular[sidecar]

配置settings.py文件

INSTALLED_APPS = [# ALL YOUR APPS'drf_spectacular','drf_spectacular_sidecar',  # required for Django collectstatic discovery
]
SPECTACULAR_SETTINGS = {'SWAGGER_UI_DIST': 'SIDECAR',  # shorthand to use the sidecar instead'SWAGGER_UI_FAVICON_HREF': 'SIDECAR','REDOC_DIST': 'SIDECAR',# OTHER SETTINGS
}

注意:SPECTACULAR_SETTINGS,与之前的重复进行合并处理

2.4路由配置

在根urls.py中增加路由配置

from drf_spectacular.views import SpectacularJSONAPIView, SpectacularRedocView, SpectacularSwaggerViewurlpatterns = [    path('swagger/json/', SpectacularJSONAPIView.as_view(), name='schema'),    # Optional UI:    path('swagger/ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),    path('swagger/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),    # YOUR PATTERNS
]

2.5访问测试

访问路径:http://localhost:8000/swagger/ui/

文档没有接口,是因为我们接口还没有添加api注释相关的内容。如何使用呢?

2.6 接口添加注释

官方给的截图

from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample
from drf_spectacular.types import OpenApiTypesclass AlbumViewset(viewset.ModelViewset):serializer_class = AlbumSerializer@extend_schema(request=AlbumCreationSerializer,responses={201: AlbumSerializer},)def create(self, request):# your non-standard behaviourreturn super().create(request)@extend_schema(# extra parameters added to the schemaparameters=[OpenApiParameter(name='artist', description='Filter by artist', required=False, type=str),OpenApiParameter(name='release',type=OpenApiTypes.DATE,location=OpenApiParameter.QUERY,description='Filter by release date',examples=[OpenApiExample('Example 1',summary='short optional summary',description='longer description',value='1993-08-23'),...],),],# override default docstring extractiondescription='More descriptive text',# provide Authentication class that deviates from the views defaultauth=None,# change the auto-generated operation nameoperation_id=None,# or even completely override what AutoSchema would generate. Provide raw Open API spec as Dict.operation=None,# attach request/response examples to the operation.examples=[OpenApiExample('Example 1',description='longer description',value=...),...],)def list(self, request):# your non-standard behaviourreturn super().list(request)@extend_schema(request=AlbumLikeSerializer,responses={204: None},methods=["POST"])@extend_schema(description='Override a specific method', methods=["GET"])@action(detail=True, methods=['post', 'get'])def set_password(self, request, pk=None):# your action behaviour...

找一个最简单的接口添加

from rest_framework.decorators import api_view
from drf_spectacular.utils import extend_schema, OpenApiExample, inline_serializer
@extend_schema(responses={(200, 'text/html'): {'description': 'Simple HTML page','type': 'string','example': '<html>Example text</html>'},(202, 'application/json'): {'description': 'JSON response','type': 'object','properties': {'title': {'type': 'string','minLength': 1,'maxLength': 128}},'required': ['title']},}
)
@api_view(['GET'])
def test2(request):# cache.set('hobby', 'film')print(cache.get('hobby'))return HttpResponse('缓存成功')

2.7 再次访问测试验证

在访问刚才的swagger地址

 

2.8 属性标签介绍

如果想要修改指定接口所属的标签,我们可以使用drf-spectacular提供的extend_schema装饰器函数,函数定义如下:

def extend_schema(operation_id: Optional[str] = None,parameters: Optional[Sequence[Union[OpenApiParameter, _SerializerType]]] = None,request: Any = empty,responses: Any = empty,auth: Optional[Sequence[str]] = None,description: Optional[_StrOrPromise] = None,summary: Optional[_StrOrPromise] = None,deprecated: Optional[bool] = None,tags: Optional[Sequence[str]] = None,filters: Optional[bool] = None,exclude: Optional[bool] = None,operation: Optional[Dict] = None,methods: Optional[Sequence[str]] = None,versions: Optional[Sequence[str]] = None,examples: Optional[Sequence[OpenApiExample]] = None,extensions: Optional[Dict[str, Any]] = None,callbacks: Optional[Sequence[OpenApiCallback]] = None,external_docs: Optional[Union[Dict[str, str], str]] = None,
) -> Callable[[F], F]:

这个装饰器主要用于修改view在文档中的定义,参数意义如下:

operation_id:一个唯一标识ID,基本用不到

parameters:添加到列表中的附加或替换参数去自动发现字段。

responses:替换Serializer。需要各种各样的可单独使用或组合使用的输入(有以下7种) Serializer类 序列化实例,比如:Serializer(many=True) OpenApiTypes的基本类型或者实例 OpenApiResponse类 PolymorphicProxySerializer类 1个字典,以状态码作为键, 以上其中一项作为值(是最常用的,格式{200, None}) 1个字典,以状态码作为键,以media_type作为值

request:替换序列化,接受各种输入 Serializer 类或者实例 OpenApiTypes基本类型或者实例 PolymorphicProxySerializer类 1个字典,以media_type作为键,以上其中一项作为值

auth:用auth方法的显式列表替换发现的auth

description:替换发现的文档字符串

summary:一个可选的短的总结描述

deprecated:将操作标记为已弃用

tags:覆盖默认标记列表

exclude:设置为True以从schema中排除操作

operation:手动覆盖自动发现将生成的内容。你必须提供一个兼容OpenAPI3的字典,该字典可以直接翻译成YAML。

methods:检查extend_schema中特殊的方法,默认匹配所有

versions:检查extend_schema中特殊的API版本,默认匹配所有

example:将请求/响应示例附加到操作中

extensions:规范扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2804631.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

网络原理-UDP/TCP协议

协议 在网络通信中,协议是非常重要的一个概念,在下面,我将从不同层次对协议进行分析. 应用层 IT职业者与程序打交道最多的一层,调用系统提供的API写出的代码都是属于应用层的. 应用层中有很多现成的协议,但是更多的,我们需要根据实际情况来进行制作自定义协议. 自定义协议…

【行业会议】优积科技应邀参加住建部模块建筑企业2023年工作座谈会

2023年3月2日&#xff0c;优积建筑科技发展&#xff08;上海&#xff09;有限公司&#xff08;以下简称“优积科技”&#xff09;应邀参加由住房和城乡建设部科技与产业化发展中心&#xff08;以下简称“住建部科技与产业化中心”&#xff09;组织召开的模块建筑企业2023年工作…

linux0.11 源码阅读 head.s setup.s bootsect.s加载位置

从github上下载linux0.11源码 linux0.11源码 将0x10000处的代码往下复制到0开始的地址处。 移动后的内存布局如下 setup中存在gdt和idt的相关数据。此时需要用gdtr和idtr寄存器指向对应的数据。 实模式下&#xff0c;访问内存方式。最多访问1M内存。 分页模式下&…

在Linux操作系统的ECS实例上安装Hive

目录 1. 完成hadoop安装配置2. 安装配置MySql安装配置 3. 安装Hive4. 配置元数据到MySQL5. hiveserver2服务配置文件测试 1. 完成hadoop安装配置 在Linux操作系统的ECS实例上安装hadoop 以上已安装并配置完jdk、hadoop也搭建了伪分布集群 2. 安装配置MySql 安装 下下一步…

Vue 3.0中Tree shaking特性

在 Vue 3.0 中&#xff0c;引入了更好的 Tree shaking 特性&#xff0c;使得在使用 Vue 3 的项目中能够更加高效地进行代码精简和优化。 Tree shaking 是指在打包过程中通过静态分析&#xff0c;去除未使用的代码&#xff08;未被引用的模块或函数&#xff09;&#xff0c;从而…

【Vuforia+Unity】AR07-实现识别条码、二维码内容功能(Barcode Scanner)

Barcode Scanner in Unity | Vuforia Library官方教程&#xff0c;写的很详细&#xff0c;本教程主要参考对象&#xff01; 主要实现扫描生活中常见的二维码&#xff0c;然后弹出二维码链接&#xff0c;当然我们也可以再次回调自定义函数&#xff0c;弹出数字内容&#xff0c;…

鸿蒙LiteOS-M 内核初始化

目录 一、LiteOS-M 初始化内核二、LOS_KernelInit代码分析三、LOS_Start代码解析坚持就有收获 一、LiteOS-M 初始化内核 在LiteOS-M应用程序中&#xff0c;系统初始化如下&#xff1a; /*** brief This is the ohos entry, and you could call this in your main funciton af…

stm32利用CubeMX完成按键控制LED灯的点亮与熄灭

首先画电图&#xff0c;如下&#xff1a;&#xff08;会话最小系统后就可以不画了&#xff0c;如果要是画实物的话必须要有的&#xff0c;不能忘&#xff0c;模拟就无所谓了&#xff09; 然后是CubeMX设置时钟 这次使用的是内部8M时钟&#xff0c;这样能避免proteus闪退的情况&…

nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群

一、前言 1、简介 Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;被广泛使用。且现如今很多高并发场景需要后端服务集群部署&#xff0c;因此nginx也需要支持集群部署从而避免单点故障的问题。 本文将详细介绍使用 KeepalivedNginx 来实现Nginx的高可用集群和N…

Linux环境安装jira

jira 是项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 jira 软件安装包直接搜官网&#xff0c;然后可以选择免费的来下载&#xff1a; 安装 jira 之前&#xff0c;需要 Java 和 mysql 环境的…

Linux的ACL权限以及特殊位和隐藏属性

前言&#xff1a; ACL是什么&#xff1f; ACL&#xff08;Access Control List&#xff09;是一种权限控制机制&#xff0c;用于在Linux系统中对文件和目录进行细粒度的访问控制。传统的Linux权限控制机制基于所有者、所属组和其他用户的三个权限类别&#xff08;读、写、执行…

八、线性代数二 ,矩阵的秩

目录 1、矩阵子式的定义与子式个数的计算&#xff1a; 2、矩阵秩的定义&#xff1a; 3、矩阵秩的计算方法&#xff1a; 4、矩阵秩的 性质&#xff1a; 线性代数四——几个重要的矩阵点积_线性代数 矩阵点积-CSDN博客 1、矩阵子式的定义与子式个数的计算&#xff1a; 概念&…

Java基于微信小程序的智能停车场管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【python】yolo目标检测模型转为onnx,及trt/engine模型的tensorrt轻量级模型部署

代码参考&#xff1a; Tianxiaomo/pytorch-YOLOv4: PyTorch ,ONNX and TensorRT implementation of YOLOv4 (github.com)https://github.com/Tianxiaomo/pytorch-YOLOv4这个大佬对于各种模型转化写的很全&#xff0c;然后我根据自己的需求修改了部分源码&#xff0c;稍微简化了…

设计模式——三大工厂模式

工厂模式 简单工厂模式&#xff08;静态工厂模式&#xff09; 介绍&#xff1a; 1、简单工厂模式是属于创建型模式&#xff0c;是工厂模式的一种&#xff0c;**简单工厂模式是由一个工厂对象决定创建出哪种产品的实例**。是工厂模式中最简单使用的模式 2、简单工厂模式&#…

使用ffmpeg实现视频片段截取并保持清晰度

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i input.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-ve…

HTB pwn Dragon Army

逆向分析 程序使用了alloca函数扩大了栈区 此处可以泄露libc的地址 程序主要功能在下面 while ( 1 ){while ( 1 ){fflush(stdin);fflush(_bss_start);fprintf(_bss_start, "\n%sDragons: [%d/%d]%s\n\n", "\x1B[1;34m", v5, 13LL, "\x1B[1;37m"…

RLE 稀疏水平集 RLE sparse level sets 论文阅读笔记

目录 RLE 稀疏水平集随机访问水平集游程类型编码CSG 操作增强水平集 表现动画角色网格面到 RLE 水平集自相交时间抗锯齿 总结 原文&#xff1a; Houston, Ben, Mark Wiebe, and Chris Batty. “RLE sparse level sets.” ACM SIGGRAPH 2004 Sketches. 2004. 137. 只有一页&am…

【Java】RestClient的使用

RestClient的使用 先导入Maven坐标&#xff0c;要和elasticsearch和kibana的版本保持一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1<…

【深度学习】LoRA: Low-Rank Adaptation of Large Language Models,论文解读

文章&#xff1a; https://arxiv.org/abs/2106.09685 文章目录 摘要介绍LoRA的特点什么是低秩适应矩阵&#xff1f;什么是适应阶段&#xff1f;低秩适应矩阵被注入到预训练模型的每一层Transformer结构中&#xff0c;这一步是如何做到的&#xff1f; 摘要 自然语言处理的一个重…