• drf-自动生成接口文档


    一 自动生成接口文档

    REST framework可以自动帮助我们生成接口文档。

    接口文档以网页的方式呈现。

    自动接口文档能生成的是继承自APIView及其子类的视图。

    1.1. 安装依赖

    REST framewrok生成接口文档需要coreapi库的支持。

    pip install coreapi

    1.2. 设置接口文档访问路径

    在总路由中添加接口文档路径。

    文档路由对应的视图配置为rest_framework.documentation.include_docs_urls

    参数title为接口文档网站的标题。

    from rest_framework.documentation import include_docs_urls
    
    urlpatterns = [
        ...
        path('docs/', include_docs_urls(title='站点页面标题'))
    ]

    1.3. 文档描述说明的定义位置

    1) 单一方法的视图,可直接使用类视图的文档字符串,如

    class BookListView(generics.ListAPIView):
        """
        返回所有图书信息.
        """

    2)包含多个方法的视图,在类视图的文档字符串中,分开方法定义,如

    class BookListCreateView(generics.ListCreateAPIView):
        """
        get:
        返回所有图书信息.
    
        post:
        新建图书.
        """

    3)对于视图集ViewSet,仍在类视图的文档字符串中封开定义,但是应使用action名称区分,如

    class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
        """
        list:
        返回图书列表数据
    
        retrieve:
        返回图书详情数据
    
        latest:
        返回最新的图书数据
    
        read:
        修改图书的阅读量
        """

    1.4. 访问接口文档网页

    浏览器访问 127.0.0.1:8000/docs/,即可看到自动生成的接口文档。

    接口文档网页

    如果遇到报错

    #AttributeError: 'AutoSchema' object has no attribute 'get_link'
    REST_FRAMEWORK = {
     'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
        # 新版drf schema_class默认用的是rest_framework.schemas.openapi.AutoSchema
    
    }

    两点说明:

    1) 视图集ViewSet中的retrieve名称,在接口文档网站中叫做read

    2)参数的Description需要在模型类或序列化器类的字段中以help_text选项定义,如:

    class Student(models.Model):
        ...
        age = models.IntegerField(default=0, verbose_name='年龄', help_text='年龄')
        ...
    
    或
    
    class StudentSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = "__all__"
            extra_kwargs = {
                'age': {
                    'required': True,
                    'help_text': '年龄'
                }
            }

    如何写好接口文档

    1 HTTP携带信息的方式

    • url
    • headers
    • body: 包括请求体,响应体

    2 分离通用信息

    一般来说,headers里的信息都是通用的,可以提前说明,作为默认参数

    3 路径中的参数表达式

    URL中参数表达式使用mustache的形式,参数包裹在双大括号之中

    例如:

    • /api/user/
    • /api/user/?age=&gender=

    4 数据模型定义

    数据模型定义包括:

    • 路径与查询字符串参数模型
    • 请求体参数模型
    • 响应体参数模型

    数据模型的最小数据集:

    • 名称
    • 是否必须
    • 说明

    “最小数据集”(MDS)是指通过收集最少的数据,较好地掌握一个研究对象所具有的特点或一件事情、一份工作所处的状态,其核心是针对被观察的对象建立起一套精简实用的数据指标。最小数据集的概念起源于美国的医疗领域。最小数据集的产生源于信息交换的需要,就好比上下级质量技术监督部门之间、企业与质量技术监督部门之间、质量技术监督部门与社会公众之间都存在着信息交换的需求。

    一些文档里可能会加入字段的类型,但是我认为这是没必要的。以为HTTP传输的数据往往都需要序列化,大部分数据类型都是字符串。一些特殊的类型,例如枚举类型的字符串,可以在说明里描述。

    另外:数据模型非常建议使用表格来表现

    举个栗子?:

    名称是否必须说明
    userType 用户类型。commom表示普通用户,vip表示vip用户
    age 用户年龄
    gender 用户性别。1表示男,0表示女

    5 请求示例

    // general 
    POST http://www.testapi.com/api/user
    
    // request payload
    {
        "name": "qianxun",
        "age": 14,
        "like": ["music", "reading"],
        "userType": "vip"
    }
    
    // response
    {
        "id": "asdkfjalsdkf"
    }

    6 异常处理

    异常处理最小数据集

    • 状态码
    • 说明
    • 解决方案

    举个栗子?:

    状态码说明解决方案
    401 用户名密码错误 检查用户名密码是否正确
    424 超过最大在线数量 请在控制台修改最大在线数量

    之前我一直不想把解决方案加入异常处理的最小数据集,但是对于很多开发者来说,即使它知道424代表超过最大在线数量。如果你不告诉如果解决这个问题,那么他们可能就会直接来问你。所以最好能够一步到位,直接告诉他应该如何解决,这样省时省力。

    7 如何组织?

    7.1 一个创建用户的例子:创建用户

    1 请求示例

    // general 
    POST http://www.testapi.com/api/user/vip/?token=abcdefg
    
    // request payload
    {
        "name": "qianxun",
        "age": 14,
        "like": ["music", "reading"]
    }
    
    // response
    {
        "id": "asdkfjalsdkf"
    }

    2 路径与查询字符串参数模型
    POST http://www.testapi.com/api/user//?token=

    名称是否必须说明
    userType 用户类型。commom表示普通用户,vip表示vip用户
    token 认证令牌

    3 请求体参数模型

    名称是否必须说明
    name 用户名。4-50个字符
    age 年龄
    like 爱好。最多20个

    4 响应体参数模型

    名称说明
    id 用户id

    5 异常处理

    状态码说明解决方案
    401 token过期 请重新申请token
    424 超过最大在创建人数 请在控制台修改最大创建人数

    7.2 这样组织的原因

    1. 请求示例: 请求示例放在第一位的原因是,要用最快的方式告诉开发者,这个接口应该如何请求
    2. 路径与查询字符串参数模型: 使用mustache包裹参数
    3. 请求体参数模型:如果没有请求体,可以不写
    4. 响应体参数模型
    5. 异常处理

    8 文档提供的形式

    文档建议由一下两种形式,在线文档pdf文档

    • 在线文档
      • 更新方便
      • 易于随时阅读
      • 易于查找
    • pdf文档
      • 内容表现始终如一,不依赖文档阅读器
      • 文档只读,不会被轻易修改

    其中由于是面对第三方开发者,公开的在线文档必须提供;由于某些特殊的原因,可能需要提供文件形式的文档,建议提供pdf文档。当然,以下的文档形式是非常不建议提供的:

    • word文档
    • markdown文档

    word文档和markdown文档有以下缺点:

    • 文档的表现形式非常依赖文档查看器:各个版本的word文档对word的表现形式差异很大,可能在你的电脑上内容表现很好的文档,到别人的电脑上就会一团乱麻;另外markdown文件也是如此。而且markdown中引入文件只能依靠图片链接,如果文档中含有图片,很可能会出现图片丢失的情况。
    • 文档无法只读:文档无法只读,就有可能会被第三方开发者在不经意间修改,那么文档就无法保证其准确性了。

    总结一下,文档形式的要点:

      • 只读性:保证文档不会被开发者轻易修改
      • 一致性:保证文档在不同设备,不同文档查看器上内容表现始终如一
      • 易于版本管理:文档即软件(DAAS: Document as a Software),一般意义上说软件 = 数据 + 算法, 但是我认为文档也是一种组成软件的重要形式。既然软件需要版本管理,文档的版本管理也是比不可少的。
  • 相关阅读:
    源码篇——安卓启动流程
    Android源代码结构分析
    使用Contacts Contract Content Provider操作通讯录最佳实践
    Linux输入子系统 : 按键驱动
    运算类实现 及 GNU Makefile基本结构
    输入系统:epoll & inotify
    FFmpeg:初步编译使用[Android]
    Linux学习 :SPI通讯协议
    Linux学习 : 自己写bootloader
    Linux学习 :移植U-boot_2012.04.01到JZ2440开发板
  • 原文地址:https://www.cnblogs.com/bubu99/p/13763265.html
Copyright © 2020-2023  润新知