Backend - Django Swagger

devtools/2024/12/23 7:09:15/

目录

一、安装依赖

二、配置环境

三、路由(urls)

swagger%20UI%20%E7%95%8C%E9%9D%A2-toc" style="margin-left:0px;">四、swagger UI 界面

(一)UI 界面

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

1. 原因

2. 解决

swagger%E6%96%87%E6%A1%A3-toc" style="margin-left:0px;">五、自定义swagger文档

swagger_auto_schema-toc" style="margin-left:40px;">(一)装饰器 @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

二、配置环境

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

三、路由(urls)

python">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%20UI%20%E7%95%8C%E9%9D%A2">四、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代码里,将单引号替换成双引号。

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

swagger%E6%96%87%E6%A1%A3">五、自定义swagger文档

swagger_auto_schema">(一)装饰器 @swagger_auto_schema

1. 属性认知

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

python"># 所需依赖
from rest_framework import status  # Django REST Framework
from drf_yasg import openapi  # Swagger
from drf_yasg.utils import swagger_auto_schema  # Swagger
python">@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. 导入依赖

python">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参数

python">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参数

python">    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参数

python"># 和“(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内容 

python">    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。

例如:

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


http://www.ppmy.cn/devtools/2193.html

相关文章

Excel高效办公:人力资源管理(AI版)

AI人力资源管理一本通&#xff1a;147个“温馨提示”53个“教您一招”&#xff0c;掌握使用Excel高效完成人力资源管理工作的“心法”&#xff0c;助你早做完、不加班。 一本书掌握人力资源高效管理的“心法”&#xff01; 案例丰富&#xff0c;参考性强&#xff1a;本书不是…

React状态与引用(Refs)- 差异和使用场景

在本文中&#xff0c;我们将深入比较React的state和refs&#xff0c;探讨它们在特定场景下的适用性。 当需要在React应用程序中存储数据时&#xff0c;首先要考虑的问题是&#xff1a;“数据是否在组件的生命周期内的某个时刻发生变化&#xff1f;” 如果不会&#xff0c;那么…

iOS 动态对UIImageView加载到的图片进行偏移裁剪处理

关键点&#xff1a;图片偏移重绘、图片重绘时机处理 1. 图片偏移重绘问题 原因&#xff1a;UIImageView的现有填充模式已经不能满足应用需求&#xff0c;需自定义偏移量结合填充模式实现效果 方法&#xff1a;按需求样式重绘&#xff0c;设置偏移量比例&#xff0c;偏移阈值&a…

【Hello算法】 > 第 2 关 >数据结构 之 数组与链表

数据结构 之 数组与链表 1&#xff1a;Understanding data structures &#xff01;——了解数据结构——1.1&#xff1a;Classification-分类-1.2&#xff1a;Type-类型- 2&#xff1a;Arrays are the bricks that make up the wall of data structures *——数组是组成数据结…

OpenHarmony实战开发-如何利用panel实现底部面板内嵌套列表。

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表&#xff0c;分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”&#xff0c;弹出panel面板。在panel半展开时&#xff0c;手指向上滑动panel高度充满页面&#xff0c;手指向下滑动panel隐藏。在panel完全展开…

python入门(一)配置环境和选择IDE

Python&#xff0c;作为一种简洁易懂的编程语言&#xff0c;近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了&#xff0c;易于上手&#xff0c;而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发&#xff0c;Python都能发挥出色的性能&am…

以ue独立游戏为主攻

想到哪里写到哪里吧。 我决策错误了。原以为目前工作不好找&#xff0c;放松了对ue的学习。其实是错误的。 前两天&#xff0c;以前的同事内推&#xff0c;月薪三万五可能的原始股&#xff0c;面试也通过了。考虑到是小公司&#xff0c;坑也比较多&#xff0c;专业知识不懂&am…

oracle guid 使用

在Oracle数据库中&#xff0c;全局唯一标识符&#xff08;GUID&#xff09;通常用于生成一个唯一的标识符&#xff0c;这个标识符可以在整个系统中唯一地标识一个实体或记录。在Oracle中&#xff0c;GUID通常通过RAW或VARCHAR2类型来表示。Oracle本身并没有像其他数据库系统&am…