DRF自动生成OpenAPI文档

API schemas是非常有用的,可以帮助我们生成接口文档以及可与API交互的动态客户端。Django REST Framework支持自动生成OpenAPI schemas,但是目前支持的不是非常完善,需要手动修改的地方过多。在这里我们使用drf-spectacular这个第三方库来自动生成OpenAPI schemas.

drf-spectacular

安装,配置步骤可以参考drf-spectacular文档,下面简单的给出步骤。

安装和配置

  • 安装要求

      Python >= 3.6Django (2.2, 3.1, 3.2)Django REST Framework (3.10, 3.11, 3.12)
    
  • 安装

      pip3 install drf-spectacular[sidecar]
    
  • 注册

    在settings.py文件中,进行注册。

      INSTALLED_APPS = [...'drf_spectacular','drf_spectacular_sidecar',
    

    ]

  • 配置

      SPECTACULAR_SETTINGS = {'TITLE': 'Your Project API','DESCRIPTION': 'Your project description','VERSION': '1.0.0','SWAGGER_UI_DIST': 'SIDECAR',  # shorthand to use the sidecar instead'SWAGGER_UI_FAVICON_HREF': 'SIDECAR','REDOC_DIST': 'SIDECAR',}REST_FRAMEWORK = {# YOUR SETTINGS'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',}
    

使用

  1. 直接生成yaml文件,然后配合swagger-ui来使用

     python3 manage.py spectacular --file schema.yml
    
  2. 使用swagger-ui或redoc来展现

    一般情况,我们都是直接使用swagger-ui或者redoc来展现的。需要在urlpatterns中做如下的设置。

    from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
    urlpatterns = [# YOUR PATTERNSpath('api/schema/', SpectacularAPIView.as_view(), name='schema'),# Optional UI:path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
    ]
    

经过上面的基本配置,我们现在访问api/schema/swagger-ui/来查看swagger-ui风格的文档,如下所示:

当你点击schema的时候,就会显示响应字段的描述,而且会明确告知你,描述是从XXX序列化器取得的。下面给出相应的序列化器代码。

class BookInfoSerializer(serializers.Serializer):"""BookInfo序列化器"""id = serializers.IntegerField(label='书籍ID', read_only=True)name = serializers.CharField(label='名称', max_length=10)pub_date = serializers.DateField(label='发布日期')readcount = serializers.IntegerField(label='阅读量', min_value=0, required=False)commentcount = serializers.IntegerField(label='评论量', min_value=0, required=False)

我们看到的Schemas中的描述,description是来自于序列化器的文档字符串,而各个字段的title是来自于字段的label,带有*的意味着是必传的字段,除此之外,字段的其它描述是直接取自序列化器字段中的参数。
另外,对于该接口的描述也是直接来自文档字符串的内容。例如:

下面给出视图的代码

class BookListView(GenericAPIView):"""列表视图"""queryset = BookInfo.objects.all().order_by('id')serializer_class = BookInfoSerializerpagination_class = PageNumdef get(self, request):"""GET请求获取列表"""data = self.get_queryset()      # 获取查询结果集page = self.paginate_queryset(data)    #对查询结果集进行分页serializer = self.get_serializer(page, many=True)   # 序列化return Response(serializer.data)    # 返回值def post(self, request):"""post请求新增"""data = request.dataserializer = self.get_serializer(data=data)if serializer.is_valid(raise_exception=True):serializer.save()return Response(serializer.data, status=201)else:# 返回错误信息return Response({'msg': '保存失败'}, status=400)

对于HTTP Body中的内容,都在序列化器中描述了,但是对于URL参数,是默认没有描述的。我们需要手动修改,如下所示:

手动在代码中加入以下内容:

class BookView(GenericAPIView):"""删改查视图"""queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerlookup_field = 'pk'lookup_url_kwarg = 'pk'@extend_schema(parameters=[OpenApiParameter(name='id', description='书籍唯一id', required=True, type=int, location=OpenApiParameter.PATH)])def get(self, request, pk):"""根据id查询书籍详情"""obj = self.get_object()serializers = self.get_serializer(obj)


更多的信息,需要参考OpenAPI的规范,有一篇不错的文章,可以看看OpenAPI 规范摘要。
drf-spectacular自动生成文档,很大程度上依赖于文档字符串以及queryset和serializer_class(DRF的APIView没有这两个属性,对于APIView自动生成文档有困难,当然你可以直接在APIView中定义这两个属性,但是会显得很奇怪。)

在视图集中使用

对于视图集而言,可以使用@extend_schema_view装饰器来直接装饰类。例如:

@extend_schema_view(list=extend_schema(description='列表'),create=extend_schema(description='新增'),retrieve=extend_schema(description='查询一个',parameters=['id', OpenApiParameter("id", OpenApiTypes.INT, OpenApiParameter.PATH, description="书籍ID"),],),update=extend_schema(description='更新一个'),partial_update=extend_schema(description='部分更新'),destroy=extend_schema(description='删除一个'),
)
class BookModelViewSet(ModelViewSet):"""书籍视图集"""queryset = BookInfo.objects.all().order_by('id')serializer_class = BookInfoSerializerpagination_class = PageNumlookup_field = 'id'lookup_url_kwarg = 'id'lookup_url_description = '书籍id'

上面这里方法和属性来自于下面的导入操作:

from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample, extend_schema_view, OpenApiTypes

关于更多的使用方法,请参考文档

DRF自动生成OpenAPI文档相关推荐

  1. DRF 自动生成接口文档

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. Django DRF 自动生成接口文档

    文章目录 1. 引子 2. 自动生成接口文档 3. 文档描述说明的定义位置 1. 引子 前端请求的url由谁来写 url 主要有后台来写,写完给前端: 如果后台查询数据,需要借助查询条件才能查询前端需 ...

  3. 【接口文档】Django restful framework中自动生成API文档

    Django restful framework中自动生成API文档 一.Swagger概述 1.引言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档使用Word编写,or一些接口文档管理平台 ...

  4. PHP使用swagger-php自动生成api文档(详细附上完整例子)

    thinkphp5结合swagger自动生成接口文档 整体介绍 swagger-php.swagger-ui.swagger-editor swagger-ui:主要就是放到tp项目public目录下 ...

  5. Go 项目自动生成接口文档

    CSDN 中文章不一定能及时更新,欢迎关注我的博客查看最新版本:许盛的博客 背景 如何让后端同学愉快地写接口文档,是个老大难问题. 使用 GraphQL 当接口标准,倒是省了接口文档的问题,连前端代码 ...

  6. windows api中文文档_Web服务开发:Spring集成Swagger,3步自动生成API文档

    目录: 1,Spring Boot集成Swagger 2,Swagger接口文档页面 3,常见问题和解决方法 在Sping开发REST接口服务时,API文档是不可缺少的一个重要部分.Swagger框架 ...

  7. springboot 集成 swagger 自动生成API文档

    Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.简单来说,Swagger是一个功能强大的接口管理工具,并且提供了多种编程语言的前后端分离解决方案. S ...

  8. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)

    二.跨域: 回到顶部 跨域知识介绍: 点我以前博客 跨域解决方法:CORS:跨域资源共享 CORS请求分类(简单请求和非简单请求) 简单请求(simple request):只需要在头信息之中增加一个 ...

  9. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)

    阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...

最新文章

  1. 智能电视验收测试软件,验收测试
  2. npm包实现发布正式和测试版
  3. 第七章:Java_集合
  4. show status和show variables区别解析
  5. Kali Linux安装Remmina无法加载RDP插件
  6. C++基础与深度解析第六章:函数
  7. 网管学习日记-VRRP单组备份
  8. 重置 Winsock:初始化计算机网络环境
  9. XenApp简单部署
  10. Windows安装Jenkins msi文件时,用户无法授权通过验证解决方法
  11. 邮件发回软件错误信息
  12. Phython 数据类型
  13. 生命密码是几适合学计算机,生命密码学
  14. HTTP接口测试工具及使用
  15. python2.7安装教程windowsxp_怎么在windows xp 下安装python 2.7
  16. DNS服务之智能DNS
  17. Mac下配置VIM .vimrc
  18. PWM 互补两个引脚输出相同的PWM波形 CH1 和CH1N
  19. Linuxqt如何安装中文字体
  20. seata的xid是如何传播的?

热门文章

  1. 中国电信预计宽带资费未来将持续下降
  2. java集合Cloneable
  3. Scaleform结合C++编程
  4. mysql中cdc什么意思_debezium关于cdc的使用(上)
  5. 13、域渗透提权分析工具 BloodHound 1.3 中的ACL攻击路径介绍
  6. 子网掩码换算成IP地址清单
  7. ‘@Test‘ not applicable to type;使用@Test测试时出现的问题及解决办法。
  8. CESIUM离线三维地球发布教程
  9. A股level2数据接口十档行情数据代码说明
  10. java单元测试规范_Java单元测试编码规范