当前位置:   article > 正文

Backend - Django Swagger

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

二、配置环境

  1. # settings.py文件中
  2. INSTALLED_APPS = [
  3. ...
  4. 'drf_yasg',  # 注意是drf_yasg,而不是drf-yasg
  5. ...
  6. ]

三、路由(urls)

  1. from django.urls import path, re_path  # url规则
  2. from rest_framework import permissions   # API的访问权限
  3. from drf_yasg.views import get_schema_view
  4. from drf_yasg import openapi
  5. from myBook import views as book_view
  6. # 基础设置
  7. schema_view = get_schema_view(
  8. openapi.Info(
  9. title="Books API",
  10. default_version='v1',
  11. description="Books' RESTful API documentation.",
  12. terms_of_service="https://www.google.com/policies/terms/",
  13. contact=openapi.Contact(email="XXX"),
  14. license=openapi.License(name="BSD License"),
  15. ),
  16. public=True,
  17. permission_classes=[permissions.AllowAny],
  18. )
  19. # 补充swagger路由
  20. urlpatterns += [
  21. re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
  22. re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
  23. re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
  24. ]

四、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代码里,将单引号替换成双引号。

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

五、自定义swagger文档

(一)装饰器 @swagger_auto_schema

1. 属性认知

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

  1. # 所需依赖
  2. from rest_framework import status # Django REST Framework
  3. from drf_yasg import openapi # Swagger
  4. from drf_yasg.utils import swagger_auto_schema # Swagger
  1. @swagger_auto_schema(
  2. operation_summary='GET 概括'
  3. operation_description='GET 描述',
  4. manual_parameters=[
  5. openapi.Parameter(
  6. name='bookname',  # name是用来确定唯一值的(不能重复)
  7. description='这是描述',
  8. in_=openapi.IN_QUERY,
  9. type=openapi.TYPE_STRING,
  10. required=True,
  11. )
  12. ],
  13. responses={
  14. status.HTTP_200_OK: openapi.Response(
  15. description='Success',
  16. schema=openapi.Schema(
  17. type=openapi.TYPE_OBJECT,
  18. properties={
  19. 'result':  openapi.Schema(type=openapi.TYPE_BOOLEAN, description='successful!'),
  20. 'resData': openapi.Schema(
  21. type=openapi.TYPE_ARRAY, 
  22. items=openapi.Schema(
  23. type=openapi.TYPE_OBJECT, 
  24. description='该列表的items是个dict,分别有key值为key1和key2'
  25. properties={'key1': openapi.Schema(type=openapi.TYPE_INTEGER, description='第一个值'),
  26. 'key2': openapi.Schema(type=openapi.TYPE_STRING, description='第二个值'),}
  27. ),
  28. ),
  29. },
  30. ),
  31. ),
  32. status.HTTP_401_UNAUTHORIZED: openapi.Response(
  33. description='Unauthorized',
  34. schema=openapi.Schema(
  35. type=openapi.TYPE_OBJECT,
  36. properties={'result': openapi.Schema(type=openapi.TYPE_BOOLEAN, description='HTTP 401 UNAUTHORIZED.')}
  37. ),
  38. ),
  39. },
  40. )

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. 导入依赖

  1. from myApp import myserializer
  2. from myApp.myserializer import AuthorApi
  3. from drf_yasg import openapi  # Swagger
  4. from drf_yasg.utils import swagger_auto_schema  # Swagger
  5. from rest_framework.generics import GenericAPIView  # Django REST Framework
  6. from rest_framework import status  # Django REST Framework

2. 自定义openapi.Parameter参数

  1. class manualParam:
  2.         my_str = openapi.Parameter(
  3.             name='bookname',  # name是用来确定唯一值的(不能重复)
  4.             description='这是描述',
  5.             in_=openapi.IN_QUERY,
  6.             type=openapi.TYPE_STRING,
  7.             required=True,
  8.         )
  9.         my_num = openapi.Parameter(
  10.             name='authorname',
  11.             description='这是描述',
  12.             in_=openapi.IN_QUERY,
  13.             type=openapi.TYPE_NUMBER,
  14.             required=False,
  15.         )

3. 自定义openapi.Schema参数

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

4. 自定义openapi.Response参数

  1. # 和“(3)自定义openapi.Schema参数”在同一个类中
  2. class manualRes:
  3.     # Success 成功 200
  4.     response_200 = openapi.Response(
  5.                 description='Success',
  6.                 schema=openapi.Schema(
  7.                     type=openapi.TYPE_OBJECT,
  8.                     properties={
  9.                         'result': res200,
  10.                         'resData': resData,
  11.                     },
  12.                 ),
  13.             )
  14.  
  15.     # Unauthorized 无权限 401 
  16.     response_401 = openapi.Response(
  17.         description='Unauthorized',
  18.         schema=openapi.Schema(type=openapi.TYPE_OBJECT,properties={'result': res401}),
  19.     )

5. views内容 

  1.     class Book(GenericAPIView):
  2.         @swagger_auto_schema(
  3.             operation_summary='该 get 的概括'
  4.             operation_description='该 get 的描述'
  5.             manual_parameters=[
  6.                 manualParam.my_str,
  7.                 manualParam.my_num
  8.             ],
  9.             responses={
  10.                 status.HTTP_200_OK: manualRes.response_200,
  11.                 status.HTTP_401_UNAUTHORIZED: manualRes.response_401,
  12.             },
  13.         )
  14.         def get(self, request, *args, **kwargs):
  15.             try:
  16.                 reqdata = request.data
  17.                 res = AuthorApi(data=reqdata) # 使用序列化器
  18.             except Exception as e:
  19.                 pass
  20.             return JsonResponse()
  21.         @swagger_auto_schema(
  22.             operation_summary='该 post 的概括', operation_description='该 post 的描述', request_body=myserializer.SerializerBookCreate,
  23.         )
  24.         def post(self, request, *args, **kwargs):
  25.             try:
  26.                 pass
  27.             except Exception as e:
  28.                 pass
  29.             return JsonResponse()
  30.         @swagger_auto_schema(
  31.             operation_summary='该 delete 的概括', operation_description='该 delete 的描述', request_body=myserializer.SerializerBookDelete,
  32.         )
  33.         def delete(self, request, *args, **kwargs):
  34.             try:
  35.                 pass
  36.             except Exception as e:
  37.                 pass
  38.             return JsonResponse()
  39.         @swagger_auto_schema(
  40.             operation_summary='该 patch 的概括', operation_description='该 patch 的描述', request_body=myserializer.SerializerBookPatch,
  41.         )
  42.         def patch(self, request, *args, **kwargs):
  43.             try:
  44.                 pass
  45.             except Exception as e:
  46.                 pass
  47.             return JsonResponse()

六、API被弃用

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

例如:

  1. @swagger_auto_schema(
  2. operation_summary='该 post 的概括',
  3.     operation_description='该 post 的描述',
  4.     depracated=True 
  5. )

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/441262
推荐阅读
相关标签
  

闽ICP备14008679号