关于Flask 项目中使用 Swagger 的探索

引言:

  • Flask是一款流行的Python实现的Web开发微框架;
  • Swagger是一款Restful接口的文档在线自动生成+功能测试功能软件
  • 当下支持 Flask 和 Swagger 的工具大概如下:

综合比较了一下,flask-restplus 对框架入侵较大, flask-swagger 集成 Swagger-UI比较繁琐,故尝试使用 flasgger。
本文简单介绍了 flasgger 的用法,以及解决的痛点和带来的痛点。

使用方法

  • 安装使用:
    • 示例:
# 安装  flasgger==0.9.5
pip install flasgger==0.9.5
  • 加载 swagger
# -*- coding: utf-8 -*-
from traffic import app
from flasgger import Swagger
app.ready()
if app.g.is_dev():
    # 开发环境增加 swagger 文档,并且指定路由
    swagger = Swagger(app, config={"specs_route": "/traffic/apidocs/"}, merge=True)

if __name__ == '__main__':
    app.run('0.0.0.0', 3001, threaded=True)

  • 在API中使用
@api.route('/member.current', perm_ids=[], methods=['GET'])
@swag_from('../../../../apidocs/member/current.yml')  # 此处为文档地址,相对路径
def get_current_user():
    """
    当前用户昵称及权限
    :return:
    """
  • 对应的文档说明(apidocs/member/current.yml)
tags:
  - member
summary: "查询信息接口"
description: "接口描述"
consumes:
  - "application/json"
produces:
  - "application/json"

responses:
  200:
    description: 正确返回的格式
    schema:
      $ref: "#/definitions/resultDto"
  400:
    description: Bad request
  401:
    description: 未登录
  403:
    description: Forbidden
  404:
    description: Not found
  500:
    description: Internal Server Error

definitions:
  resultDto:
      type: "object"
      properties:
        code:
          type: "string"
          default: "000000"
        message:
          type: "string"
          default: "成功"
        payload:
          type: "object"
          properties:
            role_ids:
              type: "array"
              items:
                $ref: '#/definitions/int_format'
            member_id:
              type: "integer"
            name:
              type: "string"
            origin_member_name:
              type: "string"
            perm_keys:
              type: "array"
              items:
                $ref: '#/definitions/int_format'
  int_format:
    type: "integer"


  • 功能
    • API 文档:说明了 Api 接口的基本信息,请求信息,返回信息
    • API调试:类似 postman,自动填充参数类型和返回信息,能做基础参数验证。较之 postman 用户体验更佳
    • 验证参数格式类型,校验更加严谨

使用 Swagger 的目的:

  • 提升API的质量,方便开发进行自测
  • 前端某些框架可自动根据 Swagger 生成或优化代码,提升效率

痛点:

  • 严谨的规范给工程师带来不适,简单的接口或许会花费更多的时间来维护 swagger
  • 工程师需要花费学习成本
  • 需要调整现有的工作模式
    • 原有模式: 设计阶段后,开发简单快速出一份API文档给前端,然后进行开发。双方交涉较少。
    • 新的模式:设计阶段后,开发需要花时间整理详细的 Swagger 格式接口文档。开发需要部署 swagger 环境,交付前端,进行开发。API 文档流程加长了

附录:swagger yml 文件简单规则示例(https://blog.csdn.net/u010466329/article/details/78522992),具体查阅官方文档

  • GET 接口
#接口概要
summary: 查询所有用户信息
#接口描述
description: 查询出所有用户的所有信息,用户名,别名
#标签,方便快速过滤出User相关的接口
tags:
    - User
parameters:
#上面接口中定义了{id},则参数列表中必须包含参数id,并且请求类型为path
    - name: id
      in: path
      description: 要查询的用户的用户名,它是唯一标识
      required: true
      type: string
 
#返回值描述,必要自动
responses:
#返回的http状态码
200:
  description: 所有用户信息或者用户的集合信息
  #描述返回值
  schema:
    #返回值格式,可选的有array,integer,string,boolean
    type: array
    #针对array,每个条目的格式,type定义为array.必要填写items
    items:
      #引用在definitions下定义的Users
      $ref: '#/definitions/User'
#执行出错的处理
default:
  description: 操作异常,执行失败.返回信息描述错误详情
  schema:
    #值类型
    type: object
    #定义属性
    properties:
    #属性名
      message:
        #类型
        type: string
  • POST 接口
description: 注册一个用户
#请求参数
parameters:
  #参数key
- name: username
  #传递方法,formData表示表单传输,还有query表示url拼接传输,path表示作为url的一部分
  #body表示http头承载参数(body只能有一个,有body不能在有其他的)
  in: formData
  #参数描述
  description: 用户名,不能使用已经被注册过的
  #参数是否必要,默认false
  required: true
  #参数类型,可选的包括array,integer,boolean,string.使用array必须使用items
  type: string
- name: password
  in: formData
  description: 用户登陆密码,加密传输,加密存储
  required: true
  type: string
- name: alias
  in: formData
  type: string
  description: 用户别名
  #非必要字段
  required: false
responses:
#返回的http状态码
200:
  description: 通过返回值来标示执行结果 返回true表示执行成功
  schema:
     #值类型
      type: object
      #定义属性
      properties:
      #属性名
        status:
          #类型
          type: boolean
          #描述
          description: 是否成功
#执行出错的处理
default:
  description: 操作异常,执行失败.返回信息描述错误详情
  schema:
    #值类型
    type: object
    #定义属性
    properties:
    #属性名
      message:
        #类型
        type: string

  • 定义model信息
definitions:
  User:
    #值类型
    type: object
    #定义属性
    properties:
    #属性名
      id:
        #类型
        type: string
        #描述
        description: 用户的唯一id
      username:
        type: string
        description: 用户名
      alias:
        type: string
        description: 别名
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容