Backend - Django Swagger

目录

一、安装依赖

二、配置环境

三、路由(urls)

四、swagger UI 界面

(一)UI 界面

(二)单引号问题:Expecting property name enclosed in double quotes

1. 原因

2. 解决

五、自定义swagger文档

(一)装饰器 @swagger_auto_schema

1. 属性认知

2. manual_parameters属性

(1)name:参数名

(2)in_:参数位于 request 的 某个位置

(3)type:参数类型

 (二)应用

1. 导入依赖

2. 自定义openapi.Parameter参数

3. 自定义openapi.Schema参数

4. 自定义openapi.Response参数

5. views内容 

六、API被弃用


一、安装依赖

pip install drf-yasg==1.21.5

二、配置环境

# settings.py文件中
INSTALLED_APPS = [...'drf_yasg',  # 注意是drf_yasg,而不是drf-yasg...
]

三、路由(urls)

from django.urls import path, re_path  # url规则
from rest_framework import permissions   # API的访问权限
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from myBook import views as book_view# 基础设置
schema_view = get_schema_view(openapi.Info(title="Books API",default_version='v1',description="Books' RESTful API documentation.",terms_of_service="https://www.google.com/policies/terms/",contact=openapi.Contact(email="XXX"),license=openapi.License(name="BSD License"),),public=True,permission_classes=[permissions.AllowAny],
)# 补充swagger路由
urlpatterns += [re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]

四、swagger UI 界面

(一)UI 界面

        浏览器输入swagger UI 的链接: http://127.0.0.1:8000/swagger/

        注意:

        1. 链接XXX/swagger尾巴,还有后缀“/”。

        2. 只要符合restful API序列化类写法的对应路由,就会呈现在swagger UI界面上。

针对Django 序列化,可参考另一篇文章:Backend - DRF 序列化(django-rest-framework)-CSDN博客    

(二)单引号问题:Expecting property name enclosed in double quotes

1. 原因

        swagger UI界面中,字典里的引号都得用双引号,而不是单引号。

2. 解决

        python代码里,将单引号替换成双引号。

import json 
my_str.replace("\'", "\"")
my_dict = json.loads(my_str)

五、自定义swagger文档

(一)装饰器 @swagger_auto_schema

1. 属性认知

        以get方法的@swagger_auto_schema装饰器为例,一般情况下有operation_summary、operation_description、manual_parameters、responses等属性。

# 所需依赖
from rest_framework import status  # Django REST Framework
from drf_yasg import openapi  # Swagger
from drf_yasg.utils import swagger_auto_schema  # Swagger
@swagger_auto_schema(operation_summary='GET 概括', operation_description='GET 描述',manual_parameters=[openapi.Parameter(name='bookname',  # name是用来确定唯一值的(不能重复)description='这是描述',in_=openapi.IN_QUERY,type=openapi.TYPE_STRING,required=True,)],responses={status.HTTP_200_OK: openapi.Response(description='Success',schema=openapi.Schema(type=openapi.TYPE_OBJECT,properties={'result':  openapi.Schema(type=openapi.TYPE_BOOLEAN, description='successful!'),'resData': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT, description='该列表的items是个dict,分别有key值为key1和key2', properties={'key1': openapi.Schema(type=openapi.TYPE_INTEGER, description='第一个值'),'key2': openapi.Schema(type=openapi.TYPE_STRING, description='第二个值'),}),),},),),status.HTTP_401_UNAUTHORIZED: openapi.Response(description='Unauthorized',schema=openapi.Schema(type=openapi.TYPE_OBJECT,properties={'result': openapi.Schema(type=openapi.TYPE_BOOLEAN, description='HTTP 401 UNAUTHORIZED.')}),),},)

2. manual_parameters属性

主要参数有name、in_、type。

(1)name:参数名
(2)in_:参数位于 request 的 某个位置

        其中,openapi.IN_BODY ,参数在 request 的 body,例如 POST 请求。

        openapi.IN_QUERY ,参数在 request 的 quey,例如 user/?authorname='萝卜干'  。

        openapi.IN_FORM ,参数在 request 的 form 表单。

        openapi.IN_PATH ,参数在 request 的 path,例如 /user/<id>/。

(3)type:参数类型

        如:openapi.TYPE_NUMBER,类型为 number。

        openapi.TYPE_STRING,类型为 string。

        openapi.TYPE_BOOLEAN,类型为 boolean。

        openapi.TYPE_FILE,类型为 file。

 (二)应用

        以下内容都写在同一个views.py中。

1. 导入依赖

from myApp import myserializer
from myApp.myserializer import AuthorApi
from drf_yasg import openapi  # Swagger
from drf_yasg.utils import swagger_auto_schema  # Swagger
from rest_framework.generics import GenericAPIView  # Django REST Framework
from rest_framework import status  # Django REST Framework

2. 自定义openapi.Parameter参数

class manualParam:my_str = openapi.Parameter(name='bookname',  # name是用来确定唯一值的(不能重复)description='这是描述',in_=openapi.IN_QUERY,type=openapi.TYPE_STRING,required=True,)my_num = openapi.Parameter(name='authorname',description='这是描述',in_=openapi.IN_QUERY,type=openapi.TYPE_NUMBER,required=False,)

3. 自定义openapi.Schema参数

    class manualRes:res200 = openapi.Schema(type=openapi.TYPE_BOOLEAN, description='successful!')res401 = openapi.Schema(type=openapi.TYPE_BOOLEAN, description='HTTP 401 UNAUTHORIZED.')books_properties ={'key1': openapi.Schema(type=openapi.TYPE_INTEGER, description='第一个值'),'key2': openapi.Schema(type=openapi.TYPE_STRING, description='第二个值'),}resData = openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT, description='该列表的items是个dict,分别有key值为key1和key2', properties=books_properties ),)

4. 自定义openapi.Response参数

# 和“(3)自定义openapi.Schema参数”在同一个类中
class manualRes:# Success 成功 200response_200 = openapi.Response(description='Success',schema=openapi.Schema(type=openapi.TYPE_OBJECT,properties={'result': res200,'resData': resData,},),)# Unauthorized 无权限 401 response_401 = openapi.Response(description='Unauthorized',schema=openapi.Schema(type=openapi.TYPE_OBJECT,properties={'result': res401}),)

5. views内容 

    class Book(GenericAPIView):@swagger_auto_schema(operation_summary='该 get 的概括', operation_description='该 get 的描述', manual_parameters=[manualParam.my_str,manualParam.my_num],responses={status.HTTP_200_OK: manualRes.response_200,status.HTTP_401_UNAUTHORIZED: manualRes.response_401,},)def get(self, request, *args, **kwargs):try:reqdata = request.datares = AuthorApi(data=reqdata) # 使用序列化器except Exception as e:passreturn JsonResponse()@swagger_auto_schema(operation_summary='该 post 的概括', operation_description='该 post 的描述', request_body=myserializer.SerializerBookCreate,)def post(self, request, *args, **kwargs):try:passexcept Exception as e:passreturn JsonResponse()@swagger_auto_schema(operation_summary='该 delete 的概括', operation_description='该 delete 的描述', request_body=myserializer.SerializerBookDelete,)def delete(self, request, *args, **kwargs):try:passexcept Exception as e:passreturn JsonResponse()@swagger_auto_schema(operation_summary='该 patch 的概括', operation_description='该 patch 的描述', request_body=myserializer.SerializerBookPatch,)def patch(self, request, *args, **kwargs):try:passexcept Exception as e:passreturn JsonResponse()

六、API被弃用

若想提示某API已被弃用,则设置 depracated=True。

例如:

@swagger_auto_schema(operation_summary='该 post 的概括',operation_description='该 post 的描述',depracated=True 
)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java正则表达式教程

什么是正则表达式&#xff1a; 正则表达式是一种用来描述字符串模式的语法。在 Java 中&#xff0c;正则表达式通常是一个字符串&#xff0c;它由普通字符&#xff08;例如字母、数字、标点符号等&#xff09;和特殊字符&#xff08;称为元字符&#xff09;组成。这些特殊字符可…

Qt 实战(2)搭建开发环境 | 2.1、Windows下安装QT

一、Windows下安装QT 1、QT官网 QT官网&#xff1a;https://download.qt.io/&#xff0c;打开官网地址&#xff0c;如下&#xff1a; 目录结构介绍 目录说明snapshots预览版&#xff0c;最新的开发测试中的 Qt 库和开发工具onlineQt 在线安装源official_releases正式发布版&am…

跟TED演讲学英文:How AI can bring on a second Industrial Revolution by Kevin Kelly

How AI can bring on a second Industrial Revolution Link: https://www.ted.com/talks/kevin_kelly_how_ai_can_bring_on_a_second_industrial_revolution Speaker: Kevin Kelly Date: June 2016 文章目录 How AI can bring on a second Industrial RevolutionIntroduction…

UE 录屏自动化上传阿里云OSS

前言 最近在做一个功能&#xff0c;然后就发现了一个很有趣的东西&#xff0c;虽然在一定程度上属于偷懒&#xff0c;但是在一些短频快的应用中还是很适用的&#xff0c;下面我就针对于这个测试做一些简单的分享&#xff0c;希望帮助到大家&#xff0c;在实际的开发中获得一些灵…

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛&#xff0c;它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来&#xff0c;这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…

Pytorch搭建GoogleNet神经网络

一、创建卷积模板文件 因为每次使用卷积层都需要调用Con2d和relu激活函数&#xff0c;每次都调用非常麻烦&#xff0c;就将他们打包在一起写成一个类。 in_channels&#xff1a;输入矩阵深度作为参数输入 out_channels: 输出矩阵深度作为参数输入 经过卷积层和relu激活函数…

0基础如何入门编程?

0基础如何进入IT行业 &#xff1f; 前言 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 主要方法有如下几点建议提供给宝子们 目录 免费视频网课学习…

36、二叉树-二叉树的中序遍历

思路&#xff1a; 二叉树的遍历可以有 前序&#xff0c;中序&#xff0c;后序&#xff0c;层序遍历。 前序&#xff1a;头左右中序&#xff1a;左头右后序&#xff1a;左右头层序:从左往右依次遍历 实现方式&#xff1a; 递归通过栈结构便于回溯 代码如下&#xff1a; c…

3D模型处理的并行化

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息&#xff0c;并分享我发现的一些小技巧&#xff0c;例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 那么我们为什么要诉诸并行计算呢&#xff1f; 使用数据有时会出现…

Backend - DRF 序列化(django-rest-framework)

目录 一、restful 、django-rest-framework 、swagger 三者的关系 &#xff08;一&#xff09;restful API&#xff08;REST API&#xff09; 1. rest 2. restful 3. api 4. restfulAPI &#xff08;二&#xff09;django-rest-framework&#xff08;简称DRF&#xff09…

Web3D智慧医院平台(HTML5+Threejs)

智慧医院的建设将借助物联网、云计算、大数据、数字孪生等技术&#xff0c;以轻量化渲染、极简架构、三维可视化“一张屏”的形式&#xff0c;让医院各大子系统管理既独立又链接&#xff0c;数据相互融合及联动。 建设医院物联网应用的目标对象&#xff08;人、物&#xff09;都…

7 pytorch DataLoader, TensorDataset批数据训练方法

前言 本文主要介绍pytorch里面批数据的处理方法&#xff0c;以及这个算法的效果是什么样的。具体就是要弄明白这个批数据选取的算法是在干什么&#xff0c;不会涉及到网络的训练。 from torch.utils.data import DataLoader, TensorDataset主要实现就是上面的数据集和数据载入…

pdf做批注编辑工具 最新pdf reader pro3.3.1.0激活版

PDF Reader Pro是一款功能强大的PDF阅读和编辑工具。它提供了多种工具和功能&#xff0c;帮助用户对PDF文档进行浏览、注释、编辑、转换和签名等操作。以下是PDF Reader Pro的一些主要特色&#xff1a; 最新pdf reader pro3.3.1.0激活版下载 多种查看模式&#xff1a;PDF Reade…

STM32 PB3 PB4 无法作为 GPIO 使用解决办法

如下所示&#xff0c;PA13 PA14 PB3 PB4 PB5, 默认是JTAG SWD的 PIN, 需要引脚ReMap 才能作为GPIO 使用。 HAL库解决办法 // __HAL_AFIO_REMAP_SWJ_ENABLE(); //Full SWJ (JTAG-DP SW-DP):// __HAL_AFIO_REMAP_SWJ_NONJTRST(); //Full SWJ (JTAG-DP SW-DP) but without NJTR…

【代理模式】静态代理-简单例子

在Java中&#xff0c;静态代理是一种设计模式&#xff0c;它涉及到为一个对象提供一个代理以控制对这个对象的访问。静态代理在编译时就已经确定&#xff0c;代理类和被代理类会实现相同的接口或者是代理类继承被代理类。客户端通过代理类来访问&#xff08;调用&#xff09;被…

认识异常(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

计算机网络:MAC地址 IP地址 ARP协议

计算机网络&#xff1a;MAC地址 & IP地址 & ARP协议 MAC地址IP地址ARP协议 MAC地址 如果两台主机通过一条链路通信&#xff0c;它们不需要使用地址就可以通信&#xff0c;因为连接在信道上的主机只有他们两个。换句话说&#xff0c;使用点对点信道的数据链路层不需要使…

开源 Ruo-Yi 项目引入 Mybatis-Plus:3.5.3 报错ClassNotFoundException:

开源 Ruo-Yi 项目引入 Mybatis-Plus:3.5.3 报错ClassNotFoundException&#xff1a; Caused by: java.lang.ClassNotFoundException: com.baomidou.mybatisplus.extension.plugins.MybatisPlusInter1 分析问题 控制台报错说明我们引入的 mybatis-plus 的依赖里找不到com.baom…

数字化转型-工具变量数据集

01、数据介绍 数字化转型是指企业或个人利用数字技术&#xff0c;如大数据、云计算、人工智能等&#xff0c;对其业务流程、运营模式、决策方式等进行全面、深入的变革&#xff0c;以提高效率、降低成本、提升质量、增强竞争力。在这个过程中&#xff0c;工具变量扮演着至关重…

JVM虚拟机(九)如何开启 GC 日志

目录 一、引言二、开启 GC 日志三、解析 GC 日志四、优化建议 一、引言 在 Java 应用程序的运行过程中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;是一个非常重要的环节。GC 负责自动管理内存&#xff0c;回收不再使用的对象所占用的…