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 成功 200
    response_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.data
                res = AuthorApi(data=reqdata) # 使用序列化器
            except Exception as e:
                pass
            return JsonResponse()
        @swagger_auto_schema(
            operation_summary='该 post 的概括', operation_description='该 post 的描述', request_body=myserializer.SerializerBookCreate,
        )
        def post(self, request, *args, **kwargs):
            try:
                pass
            except Exception as e:
                pass
            return JsonResponse()
        @swagger_auto_schema(
            operation_summary='该 delete 的概括', operation_description='该 delete 的描述', request_body=myserializer.SerializerBookDelete,
        )
        def delete(self, request, *args, **kwargs):
            try:
                pass
            except Exception as e:
                pass
            return JsonResponse()
        @swagger_auto_schema(
            operation_summary='该 patch 的概括', operation_description='该 patch 的描述', request_body=myserializer.SerializerBookPatch,
        )
        def patch(self, request, *args, **kwargs):
            try:
                pass
            except Exception as e:
                pass
            return JsonResponse()

六、API被弃用

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

例如:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【技能拾遗】——Markdown+Typora/VSCode与LaTeX的使用

&#x1f4d6; 前言&#xff1a;Markdown 是一种轻量型标记语言&#xff0c;是一种语法. 以 .md 结尾的文本文件就是 Markdown 文件。 相较于 Word&#xff0c;它更加像是 HTML 语言或是 LaTeX \LaTeX LATE​X&#xff0c;并不是最淳朴的那种"所见即所得"。 它处处透…

RTX 腾讯通停止服务,有哪些平滑升级迁移替代方案?

RTX腾讯通&#xff0c;作为腾讯公司于2003年推出的企业即时通讯软件&#xff0c;曾经在政企单位中得到广泛应用。然而&#xff0c;自2015年后&#xff0c;这款软件就未曾更新&#xff0c;近期腾讯将RTX腾讯通官网的域名更改为跳转到企业微信官网&#xff0c;这意味RTX腾讯通正式…

AGI的智力有可能在两年内超过人类水平

特斯拉CEO埃隆马斯克近日与挪威银行投资管理基金CEO坦根的访谈中表示&#xff0c;AGI的智力将在两年内可能超过人类智力&#xff0c;在未来五年内&#xff0c;AI的能力很可能超过所有人类。 马斯克透漏&#xff0c;去年人工智能发展过程中的主要制约因素是缺少高性能芯片&#…

Leetcode-移除链表元素

203. 移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&…

一张图教你看懂亚马逊云科技的超过200个云服务

亚马逊云科技&#xff08;AWS&#xff09;是业界服务种类最全面的☁️厂商&#xff0c;目前有超过200种服务&#xff0c;那这么多服务能否一次性把他们都记住呢&#xff1f; 小李哥给大家带来一张AWS 200项服务列表&#xff0c;大家一眼就能看懂这些服务的使用场景。欢迎大家在…

【HarmonyOS 4+NEXT】开发工具安装指南

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;开发工具安装 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS4NEXT&#xff1a;探索未来智能生态新纪元 文章目录 前言准备工作下载开发工具安装开发工具配置开发环境总结 前言 随着科技的不断进步&#xff0c;智能设…

硬阈值什么意思?

硬阈值是一种非线性函数&#xff0c;常用于信号处理和数据压缩中的阈值处理。具体来说&#xff0c;硬阈值将输入信号中小于或等于给定阈值的值设为零&#xff0c;而大于阈值的值保持不变。数学表示如下&#xff1a; Hard(x, T) { 0, if |x| ≤ T; x, if |x| > T } 其中&a…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

芯洲SCT55610三相栅极驱动器,打造高效无刷直流电机系统

近年来的&#xff0c;无刷直流电机&#xff08;Brushless DC Motor, BLDC&#xff09;在工业、汽车、家电、医疗器械等各个领域得到广泛应用。相对于传统有刷电机&#xff0c;BLDC电机具有以下优势&#xff1a;高效率、寿命长、低噪音、小型化和精确控制。这些优势使得BLDC电机…

Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存&#xff0c;则可以选择Ehcache&#xff1b;它支持内存和磁盘存储&#xff0c;这里不以注解方式演示&#xff0c;通过自己实现缓存管理者灵活控制缓存的读写&#xff1b; 1、引入相关依赖 <!-- ehcache3集成start --><depende…

ENSP-旁挂式AC

提醒&#xff1a;如果AC不能成功上线AP&#xff0c;一般问题不会出在AC上&#xff0c;优先关注AC-AP线路上的二层或三层组网的三层交换机 拓扑图 管理VLAN&#xff1a;99 | 业务VLAN&#xff1a;100 注意点&#xff1a; 1.连接AP的接口需要打上pvid为管理vlan的标签 2.AC和…

华为配置通过流策略实现流量统计

配置通过流策略实现流量统计示例 组网图形 图1 配置流策略实现流量统计组网图 设备 接口 接口所属VLAN 对应的三层接口 IP地址 SwitchA GigabitEthernet1/0/1 VLAN 10 - - GigabitEthernet1/0/2 VLAN 20 - - GigabitEthernet1/0/3 VLAN 10、VLAN 20 - - S…

【简单讲解下Stylus入门使用方法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

树--平衡二叉树(AVL树)

平衡二叉树画图网站 一、有序二叉树可能存在的问题 给一个数列{1,2,3,4,5,6}&#xff0c;要求创建一颗二叉排序树&#xff08;BST&#xff09;并分析问题所在。 二、平衡二叉树的基本介绍 平衡二叉树具有以下特点&#xff1a; 它是一颗空树或它的左右两个子树的高度差的绝对…

【多线程】单例模式 | 饿汉模式 | 懒汉模式 | 指令重排序问题

文章目录 单例模式一、单例模式1.饿汉模式2.懒汉模式&#xff08;单线程&#xff09;3.懒汉模式&#xff08;多线程&#xff09;改进 4.指令重排序1.概念2.question:3.解决方法4总结&#xff1a; 单例模式 一、单例模式 单例&#xff0c;就是单个实例 在有些场景中&#xff0c…

艾体宝方案 | ITT-Profitap IOTA——铁路运输的远程网络捕获和故障排除方案

在移动互联时代&#xff0c;铁路运输的数字化转型已成不可逆转的趋势。然而&#xff0c;随之而来的是对网络连接质量和故障排查的更高要求。本文将探讨如何利用艾体宝Profitap IOTA技术&#xff0c;在火车上实现远程网络捕获和故障排查&#xff0c;助力铁路运输行业迈向智能化未…

✌粤嵌—2024/4/16—x的平方根

代码实现&#xff1a; int mySqrt(int x){if (x 0 || x 1) {return x;}long int i;for (i 1; i < x / 2; i) {if (i * i < x && (i 1) * (i 1) > x) {break;}}return i; }

关于小米消金-我以为的小米消金和实际的小米消金

我原以为的小米消金&#xff0c;是一个涵盖多种金融服务的平台&#xff0c;与小米品牌紧密相连&#xff0c;提供便捷的消费金融服务。然而&#xff0c;实际的小米消金&#xff0c;其业务范围、服务细节以及运营模式都与我之前的想象有所不同。它更注重用户体验&#xff0c;提供…

KVM虚拟机

文章目录 QEMU-KVM介绍虚拟网卡流程网卡透访流程 QEMU-KVM介绍 QEMU ● QEMU是一个主机上的VMM (Virtual machine monitor), 通过动态二进制模拟CPU&#xff0c;并提供一系列的硬件模型&#xff0c;使Guest OS能够与Host硬件交互。 ● QEMU的代码中有完整的虚拟机实现&#xf…

当路由模式为hash怎么对接京东物流回调链接

为什么我要写这篇文章呢&#xff1f;是因为最近在做这个需求&#xff0c;京东物流是需要自己手动点击授权后把返回的code拿去授权&#xff0c;刚开始以为一切都很顺利的&#xff0c;然而等我看到路由为hash时候&#xff0c;浏览器会忽略#后面的东西&#xff0c;所以是无法重新跳…