前面讲到了Flask实现api,但api是给别人用的,就要告诉别人如何发现api,以及api的用途、名称、出参、入参,生成api文档的做法有好多种,本文选了一种最简单的方式。

核心就是通过app.view_functions 这个字典找到每个API 的endpoint所绑定的方法,然后访问方法的名字和文档即可

从路由中搜索api,在这里可以构筑规则

def get_api_map():"""Search API from rules, if match the pattern then we said it is API."""for rule in app.url_map.iter_rules():if 'docs' not in str(rule) and 'static' not in str(rule):yield str(rule), rule.endpoint

建立两个路由,一个是api docs的首页,一个是各个api的规则定义

@app.route('/', methods=['GET'])
def index():"""List all API to this page, api_map contains each api url + endpoint."""api_map = sorted(list(get_api_map()))index_url = url_for('index', _external=True)api_map = [(index_url + x[0][1:], x[1]) for x in api_map]return render_template('api_index.html', api_map=api_map)

@app.route('/docs/<endpoint>', methods=['GET'])

def docs(endpoint):
"""Document page for an endpoint."""
api = {
'endpoint': endpoint,
'methods': [],
'doc': '',
'url': '',
'name': ''
}

try:
func = app.view_functions[endpoint]

api['name'] = _get_api_name(func)
api['doc'] = _get_api_doc(func)

for rule in app.url_map.iter_rules():
if rule.endpoint == endpoint:
api['methods'] = ','.join(rule.methods)
api['url'] = str(rule)

except:
api['doc'] = 'Invalid api endpoint: "{}"!'.format(endpoint)

return render_template('api_docs.html', api=api)

获取api的名称和api文档内容

def _get_api_name(func):"""e.g. Convert 'do_work' to 'Do Work'"""words = func.__name__.split('_')words = [w.capitalize() for w in words]return ' '.join(words)def _get_api_doc(func):if func.__doc__:return func.__doc__else:return 'No doc found for this API!'

在原有的api函数内,补充晚上像个接口定义,包括入参、出参、名称、描述等等

@app.route('/getdimdict', methods=['GET', 'POST'])
def getdimdict():"""接口名称:        /getdimdict 获取指标库的维度字典接口描述:获取指标库的维度字典,接口入参:        get方法参数无接口出参:        json格式        data = {"code":"200",“info":"处理成功""result":{"typecode": "datelevel\","typename": "\u65e5\\u671f\\u5c42\\u7ea7\","dimcode": "01","dimname": "\\u5e74\"}}"""params = {}retinfo = {}errorflag = Falseretinfo['code'] = 200retinfo['info'] = '处理成功'retinfo['result'] = ''sqltext = config[DBSECTION]['getdimdict']jsonstr = getsqlresultjson(db, sqltext, params)retinfo['result'] = jsonstrresponse = jsonify(retinfo)response.status_code = 200return response

定义html的base页面-layout.html

{% extends "bootstrap/base.html" %}
{% block title %}Home{% endblock %}{% block styles %}{{ super() }}<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
{% endblock %}{% block content %}<div id="wrap"><!-- Begin nav bar --><div class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">API DOC DEMO</a></div><div class="collapse navbar-collapse"><ul class="nav navbar-nav"><li class="active"><a href="/">Home</a></li></ul></div></div></div><!-- Begin page content --><div class="container"><ul class="breadcrumb"><li><a href="/">Home</a></li>{% block breadcrumb_nav %}{% endblock %}</ul><div class="page-header">{% block page_header %}{% endblock %}</div>{% block content_area %}{% endblock %}</div></div><div id="footer"><div class="container"><p class="text-muted credit">Copyright © <a href="https://github.com/tobyqin/">Toby Qin</a>- <a href="https://github.com/tobyqin/flask_api_doc">Source at Github</a></p></div></div>
{% endblock %}

api_index.html

{% extends "./layout.html" %}
{% block title %}API Root{% endblock %}{% block breadcrumb_nav %}<li><a href="{{ url_for('index') }}">Api Root</a></li>
{% endblock %}{% block page_header %}<h1>Api Root</h1>
{% endblock %}{% block content_area %}
<pre>{
{% for i in api_map %}    "<a href="/docs/{{ i[1] }}">{{ i[0] }}</a>"{{ ",\n" if not loop.last }}{% endfor %}
}</pre>
{% endblock %}

api_docs.html

{% extends "./layout.html" %}
{% block title %}API - {{ api['name'] }}{% endblock %}{% block breadcrumb_nav %}<li><a href="{{ url_for('index') }}">Api Root</a></li><li><a href="{{ api['url'] }}">{{ api['name'] }}</a></li>
{% endblock %}{% block page_header %}<h1>{{ api['name'] | upper }}</h1>
{% endblock %}{% block content_area %}
<pre>
<b>Target:</b><span><a href="{{ api['url'] }}">{{ api['url'] }}</a></span>
<b>Allow :</b> <span>{{ api['methods'] }}</span>
<b>Usage :</b> <span>{{ api['doc'] }}</span>
</pre>
{% endblock %}

api首页的页面如下:

具体api的像个文档

最后,谢谢关注,谢谢支持!

Flask搭建api服务-生成API文档相关推荐

  1. 手游平台系统搭建sdk服务端接口文档

    一.登录验证 游戏登陆的token验证(游戏方获取user_id和token后访问) 游戏服务器 --> 平台服务器: http://联运平台域名/ 传值方式 POST(参数格式:数组格式) 参 ...

  2. WebAPI——自动生成帮助文档

    Web Api 自动生成帮助文档 新建Web Api项目之后,会在首页有API的导航菜单,点击即可看到API帮助文档,不过很遗憾,Description 是没有内容的. 怎么办呢? 第一步: 如果用V ...

  3. Api 接口文档是什么?如何直接使用 ApiDoc 生成接口文档

    api接口文档 现代化开发大部分都是一种前后端分离的开发模式,前端与后端分别独立进行开发.等后续再去统一的联调.前后端分离的开发模式下,前后端沟通的成本增加,如何减少口头的交流成了关键.这时有一份高端 ...

  4. 使用sphinx快速为你python注释生成API(html)文档

    sphinx简介 sphinx是一种基于Python的文档工具,它可以令人轻松的撰写出清晰且优美的文档,由Georg Brandl在BSD许可证下开发.新版的Python3文档就是由sphinx生成的 ...

  5. beego API开发以及自动化文档

    2019独角兽企业重金招聘Python工程师标准>>> beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一 ...

  6. JAVA 短信API接口调用 附 文档 Demo

    JAVA 短信API接口调用 附 文档 Demo 1.请求地址 http://host:port/sms 请求方式可以 POST 和 GET方式,建议采用POST方式 2.参数说明 参数需要 URLE ...

  7. 【人工智能 Open AI】通用 API 网关系统(API Gateway)系统设计文档

    怎样设计一个通用 API 网关系统(API Gateway)?给出具体的技术方案,细化到3级目录,不少于3000字.用markdown格式输出. 通用 API 网关系统(API Gateway)系统设 ...

  8. Java8 API在线中文阅读文档

    Java8 API在线中文阅读文档 Java8 API chm格式 链接: https://pan.baidu.com/s/1vvxrBtf0we0Y6Q19q0k2Yw 提取码: etnw

  9. 实体类 接口_spring-boot-route(五)整合Swagger生成接口文档

    目前,大多数公司都采用了前后端分离的开发模式,为了解决前后端人员的沟通问题,后端人员在开发接口的时候会选择使用swagger2来生成对应的接口文档,swagger2提供了强大的页面调试功能,这样可以有 ...

最新文章

  1. 【手写系列】对HashMap的思考及手写实现
  2. 【蓝桥杯-第五届】 啤酒和饮料
  3. python 读plt文件_用python读Excel文件
  4. 适用于Java开发人员的Elasticsearch:Elasticsearch生态系统
  5. 敲代码括号技巧_理解代码块概念,养成良好编程习惯 | 亲子课堂 第 3 课
  6. java nio有哪些功能_如何真正理解java中的NIO?
  7. 微信小程序框架探究和解析
  8. acdream 1042: Classification of the species 抽象无根树并查集
  9. 本机tomcat的server.xml被还原的问题及解决办法
  10. 你不能强迫别人进步,跟别人没法强迫你进步一样
  11. Python~FTP文件下载
  12. 计算机专业软考初级有用吗,软考:初级程序员考试有没有必要考?
  13. List转Map-JDK8实现
  14. 关键词词云怎么做_如何生成关键词云图?
  15. XJOI 3709 测测你的RP
  16. ssh反向代理实现内网穿透;ssh+nginx实现公网云服务器代理访问内网服务器
  17. 自制裸眼3D图【推荐】
  18. 被华策、欢瑞等甩下,唐人影视往日荣光已成回忆?
  19. GPS的Heading, Course, and Crab Angle不同与区别
  20. 高通机器视觉快速指南二

热门文章

  1. Spring_day02
  2. 天眼查一年 可查询导出代导自动发货下载
  3. 淘客基地公众号系统更新至v1.2.3版本
  4. Go 自定义日期时间格式解析解决方案 - 解决 parsing time xx as xx: cannot parse xx as xx 错误
  5. Cleave and spread combinators
  6. 杂谈 流行语------文言文
  7. Flash互动电子地图制作手册——入门实例
  8. 软考--流水线问题吞吐率详解
  9. R语言使用fmsb包可视化基本雷达图(radar chart、蜘蛛图spider plot)、数据预处理(计算每个变量的最大值和最小值、并合并到原数据集)、可视化单个数据对象的雷达图
  10. [杭州衡泰]软件测试面经