drf-自动生成接口文档

一、简介

  • 生成API文档平台
  • 自动生成测试代码
  • 支持接口测试

二、安装

  • coreapi(必须)
  • Pygments(可选)
  • MarkDown(可选)
pip install -i https://pypi.douban.com/simple coreapi
pip install -i https://pypi.douban.com/simple Pygments
pip install -i https://pypi.douban.com/simple MarkDown

三、使用coreapi

1.最新版的DRF(>3.10)中,需要在全局配置文件settings.py中添加如下配置

REST_FRAMEWORK = {
    # 指定用于支持coreapi的Schema
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

2.在全局路由配置文件中添加以下代码

from rest_framework.documentation import include_docs_urls
from django.urls import path, include
urlpatterns = [
path('docs/', include_docs_urls(title='测试平台接口文档')),
]

3.添加注释

1).单一方法的视图

直接给视图添加注释即可

class ProjectsListView(ListAPIView):
"""
返回所有项目信息
"""

2).多个方法的视图

class ProjectsListCreateView(ListCreateAPIView):
"""
get:
返回所有项目信息
post:
新建项目
"""

3).视图集

 
class ProjectsViewset(viewsets.ModelViewSet):
"""
create:
创建项目
retrieve:
获取项目详情数据
update:
完整更新项目
partial_update:
部分更新项目
destroy:
删除项目
list:
获取项目列表数据
names:
获取所有项目名称
interfaces:
获取指定项目的所有接口数据
"""
 

验证结果:

四、使用drf-yasg

1.安装

pip install drf-yasg

2.注册drf_yasg

将'drf_yasg'添加到全局配置的INSTALLED_APPS中

INSTALLED_APPS = [
...
'drf_yasg',
...
]

3.在全局路由文件urls.py文件中添加配置

 
# from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from django.urls import path, re_path

schema_view = get_schema_view(
    openapi.Info(
        title="API接口文档平台",  # 必传
        default_version='v1',  # 必传
        description="这是一个美轮美奂的接口文档",
        terms_of_service="http://api.xiaogongjin.site",
        contact=openapi.Contact(email="xiaogongjin@qq.com"),
        license=openapi.License(name="BSD License"),
    ),
    public=True,
    # permission_classes=(permissions.AllowAny,), # 权限类
)

urlpatterns = [
    re_path(r'^swagger(?P<format>\.json|\.yaml)$',
            schema_view.without_ui(cache_timeout=0), name='schema-json'),
    path('swagger/', schema_view.with_ui('swagger', cache_timeout=0),
         name='schema-swagger-ui'),
    path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schemaredoc'),

]
 

4.swagger展示

5.redoc展示

两点说明:

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),一般意义上说软件 = 数据 + 算法, 但是我认为文档也是一种组成软件的重要形式。既然软件需要版本管理,文档的版本管理也是比不可少的。
posted @ 2020-10-03 01:27  silencio。  阅读(570)  评论(0编辑  收藏  举报