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 这样组织的原因
请求示例
: 请求示例放在第一位的原因是,要用最快的方式
告诉开发者,这个接口应该如何请求路径与查询字符串参数模型
: 使用mustache
包裹参数请求体参数模型
:如果没有请求体,可以不写响应体参数模型
:异常处理
8 文档提供的形式
文档建议由一下两种形式,在线文档
,pdf文档
。
在线文档
- 更新方便
- 易于随时阅读
- 易于查找
pdf文档
- 内容表现始终如一,不依赖文档阅读器
- 文档只读,不会被轻易修改
其中由于是面对第三方开发者,公开的在线文档必须提供
;由于某些特殊的原因,可能需要提供文件形式的文档,建议提供pdf文档。当然,以下的文档形式是非常不建议
提供的:
- word文档
- markdown文档
word文档和markdown文档有以下缺点:
文档的表现形式非常依赖文档查看器
:各个版本的word文档对word的表现形式差异很大,可能在你的电脑上内容表现很好的文档,到别人的电脑上就会一团乱麻;另外markdown文件也是如此。而且markdown中引入文件只能依靠图片链接,如果文档中含有图片,很可能会出现图片丢失的情况。文档无法只读
:文档无法只读,就有可能会被第三方开发者在不经意间修改,那么文档就无法保证其准确性了。
总结一下,文档形式的要点:
只读性
:保证文档不会被开发者轻易修改一致性
:保证文档在不同设备,不同文档查看器上内容表现始终如一易于版本管理
:文档即软件(DAAS: Document as a Software),一般意义上说软件 = 数据 + 算法
, 但是我认为文档也是一种组成软件的重要形式
。既然软件需要版本管理,文档的版本管理也是比不可少的。