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.hqwc.cn/news/624703.html

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

相关文章

Day 27 39. 组合总和 40.组合总和II 131.分割回文串

组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 target&#xff09;都是正整数。解集不能…

CentOS下gitlab迁移和升级_gitlab备份的可以通用centos和 ubuntu吗(1)

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

IAM 统一身份认证与访问管理服务

即统一身份认证与访问管理服务&#xff0c;是云服务商提供的一套云上身份管理解决方案&#xff0c;可帮助企业安全地管理云上资源的访问权限。 在当今云计算时代&#xff0c;企业越来越依赖云服务来存储和处理敏感数据。然而&#xff0c;这也带来了新的安全挑战&#xff0c;即…

牛客2024 【牛客赛文X】春招冲刺 ONT84 子数组的最小值之和【中等 单调栈 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a7401d0dd4ec4071a31fd434e150bcc2 思路 单调栈解决的问题单调栈解决的问题是在一个数组中想知道所有数中&#xff0c; 左边离他近的比他大的和右边离他近的比他大的数 思考的问题&#xff1a;如果知道所有数上…

Web前端开发——Ajax,Axios概述及在Vue框架中的使用

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Ajax Ajax是什么&#xff1f; Ajax全称Asynchromous JavaScript And Xml&#xff0c;是异步的JavaScript和Xml。 Ajax的作用&#xff1f; 1&#xff0c;数据交换&#xff1a;通过Ajax可以给服务器…

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境&#xff1a;python3.8.10 uc的安装方法&#xff1a; pip38 install undetected-chromedriver 上测试代码&#xff1a; import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

Java项目如何使用EasyExcel插件对Excel数据进行导入导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架&#xff0c;它以使用简单、节省内存著称。在解析Excel时&#xff0c;EasyExcel没有将文件数据一次性全部加载到内存中&…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

python之flask安装以及使用

1 flask介绍 Flask是一个非常小的Python Web框架&#xff0c;被称为微型框架&#xff1b;只提供了一个稳健的核心&#xff0c;其他功能全部是通过扩展实现的&#xff1b;意思就是我们可以根据项目的需要量身定制&#xff0c;也意味着我们需要学习各种扩展库的使用。 2 python…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

PTA图论的搜索题

目录 7-1 列出连通集 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 7-2 六度空间 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 7-3 地下迷宫探索 题目 输入格式: 输出格式: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 思路 …