前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >drf的接口文档生成与管理

drf的接口文档生成与管理

作者头像
仙人技术
发布于 2021-04-13 07:02:48
发布于 2021-04-13 07:02:48
4.8K00
代码可运行
举报
运行总次数:0
代码可运行

1、接口文档简述

在项目开发中,例如web项目的前后端分离开发,需要由前后端相关人员共同定义接口,编写接口文档。之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。一个好的接口文档能够帮助我们快速上手这类项目、便于阅读已有代码、对接接口自动化测试等等

往往一个清晰的API接口文档编写起来比较费时费力,于是有很多接口文档管理工具供我们使用:YApiShowDocDocWay,以及可直接利用接口测试生成接口文档的工具PostmanApipost......

上面列出的工具或多或少都需要花费一定时间去手动维护,在drf后端项目中可以利用其自带的Core API、第三方库Swagger以及更好的drf-yasg自动生成接口文档

2、Core API生成接口文档

参考Core API官网以及drf官网,最终生成的接口文档是以网页的方式呈现的,自动接口文档能生成的是继承自APIView及其子类的视图,具体实现流程如下

2.1 安装Core API库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install coreapi
pip3 freeze > requirements.txt

2.2 设置接口文档访问路径

在配置文件settings.py中配置接口文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REST_FRAMEWORK = {
    ...
    # core api接口文档
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
}

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

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

配置url主路由,其中参数title为接口文档网站的标题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.documentation import include_docs_urls

urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='API document')),
]

2.3 文档描述说明的定义位置

  • 单一方法的视图,可直接使用类视图的文档字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HostListView(generics.ListAPIView):
    """
    返回所有主机信息.
    """
  • 包含多个方法的视图,在类视图的文档字符串中,分开方法定义
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HostListCreateView(generics.ListCreateAPIView):
    """
    get:
    返回所有主机信息.

    post:
    新建主机.
    """
  • 对于视图集ViewSet,仍在类视图的文档字符串中分开定义,但是应使用action对应的名称进行区分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HostInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    """
    list:
    返回主机列表数据

    retrieve:
    返回主机详情数据

    latest:
    返回最新的主机数据

    read:
    修改主机的访问记录
    """

2.4 访问查看

按照上述规范优化好后端接口的视图后,重启项目,访问接口文档

2.5 补充说明

1、上面访问到的接口文档,可以按照右边的指引通过安装coreapi-cli,通过命令行操作访问接口文档

2、对于视图集ViewSet中的retrieve名称,在接口文档中叫做read

3、接口文档中参数Description需要在模型类或序列化器类的字段中以help_text选项定义,例如

在模型类中定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class EnvironmentView(models.Model):
    ...
    name = models.CharField(max_length=32, verbose_name='环境名称', help_text='环境名称')
    ...

在序列化器中定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class EnvironmentModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Environment
        fields = "__all__"
        extra_kwargs = {
            'name': {
                'required': True,
                'help_text': '环境名称'
            }
          ...
        }

3、Swagger生成接口文档

3.1 Swagger介绍

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统源代码作为服务器以同样的速度来更新。

当接口有变动时,对应的接口文档也会自动更新

Swagger优势

  • Swagger可生成一个具有互动性的API控制台,可快速学习和尝试API
  • Swagger可生成客户端SDK代码,用于不同平台上JavaPython...的实现
  • Swagger文件可在许多不同的平台上从代码注释中自动生成
  • Swagger有一个强大的社区,里面有许多强悍的贡献者

要提到的是,作为一个工具人,常用的httpbin模拟请求工具也是基于swagger

下面记录在drf中通过swagger生成接口文档的具体实现流程,参考drf swagger文档

3.2 安装django-rest-swagger库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install django-rest-swagger
pip3 freeze > requirements.txt

3.3 配置app及swagger

在配置文件settings.py中进行配置

配置app

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_swagger'
]

配置swagger

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# swagger 配置项
SWAGGER_SETTINGS = {
    # 基础样式
    'SECURITY_DEFINITIONS': {
        "basic": {
            'type': 'basic'
        }
    },
    # 如果需要登录才能够查看接口文档, 登录的链接使用 restframework 自带的.
    'LOGIN_URL': 'rest_framework:login',
    'LOGOUT_URL': 'rest_framework:logout',
    # 控制API列表的显示方式 None 所有操作均已折叠 list 列出所有操作 full 扩展所有操作
    'DOC_EXPANSION': None,
    # 是否显示请求标头
    'SHOW_REQUEST_HEADERS': True,
    # 切换使用Django Auth作为身份验证机制 将其设置为True将会在Swagger UI上显示一个登录/注销按钮,并将csrf_tokens发布到API
    'USE_SESSION_AUTH': True,
    # 接口文档中方法列表以首字母升序排列
    'APIS_SORTER': 'alpha',
    # 如果支持json提交, 则接口文档中包含json输入框
    'JSON_EDITOR': True,
    # 方法列表字母排序
    'OPERATIONS_SORTER': 'alpha',
    # 在线模式验证器的URL 修改为指向本地安装,或设置None为禁用
    'VALIDATOR_URL': None,
}

3.4 配置相关路由

由于上面开启了访问swagger需要登录,因此需要在路由中开启drf默认的登录入口,修改主路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.schemas import get_schema_view
from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer
schema_view = get_schema_view(title='Users API', renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer])

urlpatterns = [
    # drf认证
    path(r'api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    # swagger接口文档
    path('docs/', schema_view, name='docs'),
    ...
]

3.5 访问查看

完成后重启项目,如果在此之前有进行数据库同步并创建了用户,那么就可以直接访问接口文档的url,并跳转到drf的认证界面进行登录

swagger界面给人以清爽简约的感觉,通过展开接口还可以对接口(传参)进行测试

3.6 说明

Django REST Swagger19年开始就已弃用不再维护了,作者在官方网站上说明了更推荐使用drf-yasg

可以阅读https://github.com/marcgibbons/django-rest-swagger查看更多相关说明

4、drf-yasg(Swagger升级版)

4.1 drf-yasg介绍

参考drf-yasg官网drf-yasg是基于SwaggerOpenAPI 2.0规范的API文档自动化生成工具,能够生成比原生swagger更为友好的API文档界面

目前的兼容性如下

  • Django Rest Framework: 3.10, 3.11, 3.12
  • Django: 2.2, 3.0, 3.1
  • Python: 3.6, 3.7, 3.8, 3.9

4.2 安装drf-yasg库

在操作下面的步骤前请将第3节swagger相关内容全部注释或还原

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install drf-yasg
pip3 freeze > requirements.txt

4.3 配置app

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    ...
    'rest_framework',
    'drf_yasg'
]

4.4 配置路由url

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
...

schema_view = get_schema_view(
    # 具体定义详见 [Swagger/OpenAPI 规范](https://swagger.io/specification/#infoObject)
    openapi.Info(
        title="Snippets API",
        default_version='v1',
        description="Test description",
        terms_of_service="https://www.google.com/policies/terms/",
        contact=openapi.Contact(email="contact@snippets.local"),
        license=openapi.License(name="BSD License"),
    ),
    # public 表示文档完全公开, 无需针对用户鉴权
    public=True,
    # 可以传递 drf 的 BasePermission
    permission_classes=(permissions.AllowAny,),
)

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

drf-yasg会暴露4种默认路径endpoint, 分别为:

  • /swagger.json, JSON 格式的 API 定义
  • /swagger.yaml, YAML 格式的 API 定义
  • /swagger/, 基于原生 swagger-ui 样式的前端页面
  • /redoc/, 基于 ReDoc 样式的前端页面

4.5 访问查看

完成后重启项目进行访问

swagger

redoc

4.6 更多配置及说明

4.6.1 get_schema_view的配置

函数 get_schema_view 的作用是返回自动生成 API 文档的视图类, 该函数接受以下参数:

  • info: Swagger API Info对象, 具体定义详见 Swagger/OpenAPI 规范, 如果缺省, drf-yasg默认会用 DEFAULT_INFO 进行填充
  • url: 项目API的基础地址, 如果缺省, 则根据视图所在的位置进行推导
  • patterns: 自定义的urlpatterns, 该参数直接透传至SchemaGenerator
  • urlconf: 描述从哪个文件获取路由配置, 缺省值是urls, 该参数直接透传至SchemaGenerator
  • public: 描述API文档是否公开, 如果未 False, 则仅返回当前用户具有权限的接口endpointsAPI文档
  • validators: 用于校验自动生成的Schema的校验器, 目前仅支持 ssvflex
  • generator_class: 自定义OpenAPI schema生成器类, 该类应该继承自 OpenAPISchemaGenerator
  • authentication_classes: 用于schema view进行登录认证的类
  • permission_classes: 用于schema view进行权限校验的类
4.6.2 SchemaView 的配置

通过函数get_schema_view可以获取对应的SchemaView, 调用该类的with_uiwithout_ui方法可生成对应的视图函数, 将其添加进urlpatterns即可访问到自动生成的 API 文档

  • SchemaView.with_ui(renderer, cache_timeout, cache_kwargs): 返回使用指定UI渲染器的视图函数, 可选的UI渲染器有: swagger, redoc
  • SchemaView.without_ui(cache_timeout, cache_kwargs): 返回无UI的视图函数, 该函数可以返回json/yaml格式的swagger文档

以上两个函数均支持通过 cache_timeoutcache_kwargs 配置缓存参数

4.6.3 缓存的配置

由于schema通常在服务运行期间不会发生改变, 因此 drf-yasg使用django内置的 cache_page 实现开箱即用的缓存功能, 只需要配置对应的参数即可启用, 对应参数解释如下:

  • cache_timeout: 用于指定缓存的生存时间
  • cache_kwargs: 用于传递 cache_page 允许接受的非位置参数, 如 cache(指定 cache backend), key_prefix(缓存key的前缀) 等等, 详见django官方文档

需要注意的是, 由于 drf-yasg 支持针对不同用户返回不一样的 API 文档(通过publicauthentication_classespermission_classes等参数配置), 因此对于不同用户(通过HTTP 请求头中的 CookieAuthorization 进行区分), 会在内存中分别进行缓存。

4.6.4 校验文档有效性

为保证自动生成文档的有效性, 可以通过在get_schema_view中设置 validators 参数开启校验自动化生成文档是否符合OpenAPI2.0规范的功能

4.6.5 代码自动生成

使用Swagger/OpenAPI规范生成文档的好处之一, 就是能通过API文档自动生成不同语言SDK,该功能由swagger-codegen提供

see you ~

参考: http://blog.shabbywu.cn/posts/2020/04/15/python-auto-doc-for-drf.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
指针详解(3)
在使用上,由于pstr存放的是字符串第一个字符的地址所以 对pstr解引用就可以打印第一个字符,打印整个操作符只需提供首元素的地址,使用%s就可以打印出来。
技匠晓晨
2024/11/26
830
指针详解(3)
【C语言】带你手把手拿捏指针(3)(含转移表)
   在指针的类型中我们知道有⼀种指针类型为字符指针 char* ,⼀般使⽤的方式如下:
TANGLONG
2024/10/15
1060
【C语言】带你手把手拿捏指针(3)(含转移表)
C语言重点突破(2)指针(二)
在我的前一章节,我们提到指针也有类型的区分,有整型指针,浮点型指针,下面我们讲讲字符指针
对编程一片赤诚的小吴
2024/01/23
1320
C语言重点突破(2)指针(二)
带你深层了解c语言指针
arr1数组,arr2数组,arr3数组在内存中都有自己独立的内存空间, 我们将这三个一维数组的首元素地址放在一个新的指针的数组(arr)中,通过指针数组来访问这三个一维数组,效果就如同二维数组一样,但并不是真正的二维数组. 图解:
初阶牛
2023/02/27
2930
带你深层了解c语言指针
指针详解(二级指针、指针数组和数组指针、字符指针、二维数组传参、函数指针变量)(二)
走在努力路上的自己
2024/01/26
6280
指针详解(二级指针、指针数组和数组指针、字符指针、二维数组传参、函数指针变量)(二)
拿捏指针(二)
前面我们已经讲了,C语言的第一篇《拿捏指针(一)》,接下里我们继续深入的来了解指针。
秋邱
2024/10/09
760
拿捏指针(二)
【C语言】进阶指针
例如下面代码,pc就是一个字符指针;"abcdef"是一个常量字符串,不能被修改,pb里面存的是该常量字符串的首字符’ a '的地址。
YoungMLet
2024/03/01
950
指针进阶(1)
代码 const char* p = “abcdef”; 并不是把字符串 abcdef 放到字符指针 p 里去,而是把字符串 abcdef 首字符的地址放到 p 中去;同时,因为 abcdef 是一个常量字符串,所以要用 const 进行修饰,以保证 p 中的内容不会被修改。
waves浪游
2024/01/22
1310
指针进阶(1)
【C语言期末不挂科——指针进阶篇】【上】
  指针的类型里面我们知道有一种指针 类型为 字符指针(char *),经过初阶的学习我们已经能用:
用户11029129
2024/06/04
840
【C语言期末不挂科——指针进阶篇】【上】
拿下大怪兽——指针
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的元素。
用户11328191
2024/10/23
870
拿下大怪兽——指针
C语言进阶-高阶指针
目录 前言 字符指针 指针数组 数组指针 &数组名VS数组名 数组指针的使用 数组参数、指针参数 一维数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 函数指针数组 指向函数指针数组的指针 ---- 前言 对于初阶指针内容在我的另一篇文章中已经写到(有想法的可以去看看) 附上链接:C语言初阶指针 回顾: 1. 指针是地址,指针变量是用来存放地址的变量(唯一标识一块内存空间)  2. 指针的大小是固定的4/8个字节(32位平台/64位平台)  3. 指针的类型决定了指针的+-整数的步长,指
用户9645905
2022/11/30
4080
C语言进阶-高阶指针
C语言----深入理解指针(3)
char* p = "abcdef";//这里的赋值是讲字符串中首字符的地址存在p中
凯子坚持C
2024/09/23
990
C语言指针深度解剖
指针是C语言的灵魂,深入理解指针,是学好学会C语言的重要前提。因此,本文将重点讲解C语言指针的深度内容。
二肥是只大懒蓝猫
2023/03/30
4870
C语言指针深度解剖
C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷三)
迷迭所归处
2025/03/20
700
C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷三)
关于指针数组与数组指针详解(知识点全面)
它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每个元素都是一个指针。
利刃大大
2023/04/12
3400
关于指针数组与数组指针详解(知识点全面)
【C语言】指针进阶:字符指针&&数组指针&&函数指针
✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 🌹感谢您的点赞与关注,同时欢迎各位有空来访我的🍁平凡舍 ---- 文章目录 @[toc] 🚀前言 🚀字符指针 🚀指针数组 🚀数组指针 🍁&数组名 与 数组名 🍁数组指针的使用 🚀数组传参、指针参数 🍁一维数组传参 🍁二维数组传参 🍁一级指针传参 🍁二级指针传参 🚀函数指针 🚀结语 🚀前言 回想之前,我们学了指针的一些基础👉 指针与结构体 我们知道了指针的概念
平凡的人1
2022/11/15
3.1K0
【C语言】指针进阶:字符指针&&数组指针&&函数指针
指针进阶详解
理论上字符串第一个字符被改为w,实际上代码无法正常运行,直接挂掉。所以避免被修改,我们const修饰字符指针,避免其被改。
用户10517932
2023/10/07
2150
指针进阶详解
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
(2)在定义指针变量时,指针变量名前的*表示现定义的是一个指针类型的变量。星号并不是指针变量名的一部分,只是一个标志
小徐在进步
2024/10/04
2020
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
C语言之指针详解(3)
上述的代码const char* pstr = "hello bit.";特别容易让大家以为是把字符串hello bit.放到字符指针pstr里了,但是本质是把字符串hello bit.首字符的地址放到了pstr中。所以说,上面的代码是把常量字符串的首字符h的地址放到指针变量pstr中。
Crossoads
2024/10/21
770
C语言之指针详解(3)
抽丝剥茧C语言(高阶)指针的进阶
数组指针是指针?还是数组? 答案是:指针。 我们已经熟悉: 整形指针: int * pint; 能够指向整形数据的指针。 浮点型指针: float * pf; 能够指向浮点型数据的指针。 那数组指针应该是:能够指向数组的指针。 下面代码哪个是数组指针?
有礼貌的灰绅士
2023/03/28
4250
抽丝剥茧C语言(高阶)指针的进阶
相关推荐
指针详解(3)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1、接口文档简述
  • 2、Core API生成接口文档
    • 2.1 安装Core API库
    • 2.2 设置接口文档访问路径
    • 2.3 文档描述说明的定义位置
    • 2.4 访问查看
    • 2.5 补充说明
  • 3、Swagger生成接口文档
    • 3.1 Swagger介绍
    • 3.2 安装django-rest-swagger库
    • 3.3 配置app及swagger
    • 3.4 配置相关路由
    • 3.5 访问查看
    • 3.6 说明
  • 4、drf-yasg(Swagger升级版)
    • 4.1 drf-yasg介绍
    • 4.2 安装drf-yasg库
    • 4.3 配置app
    • 4.4 配置路由url
    • 4.5 访问查看
    • 4.6 更多配置及说明
      • 4.6.1 get_schema_view的配置
      • 4.6.2 SchemaView 的配置
      • 4.6.3 缓存的配置
      • 4.6.4 校验文档有效性
      • 4.6.5 代码自动生成
加入讨论
的问答专区 >
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档