目录
一、安装依赖
二、配置环境
三、路由(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
)