当前位置:网站首页>Flash build API Service - generate API documents
Flash build API Service - generate API documents
2022-07-07 17:08:00 【Python and big data analysis】
We talked about Flask Realization api, but api It's for others , Just tell others how to find api, as well as api Use of 、 name 、 The ginseng 、 Enter the reference , Generate api There are many ways to document , This article chooses the simplest way .
The core is adopt app.view_functions
This dictionary finds every API Of endpoint Bound method , Then access the name and document of the method
Search from the route api, Rules can be built here
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
Establish two routes , One is api docs Home page , One is each api Rule definition of
@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)
obtain api Name and api Document content
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!'
In the original api Within the function , Add night like an interface definition , Including input 、 The ginseng 、 name 、 Description and so on
@app.route('/getdimdict', methods=['GET', 'POST'])
def getdimdict():
"""
The name of the interface : /getdimdict Get the dimension Dictionary of the indicator Library
Interface description :
Get the dimension Dictionary of the indicator Library ,
Interface input parameters : get Method
No parameters
Interface output parameters : json Format data = {
"code":"200",
“info":" Handle a successful "
"result":{
"typecode": "datelevel\",
"typename": "\u65e5\\u671f\\u5c42\\u7ea7\",
"dimcode": "01",
"dimname": "\\u5e74\"
}
}
"""
params = {}
retinfo = {}
errorflag = False
retinfo['code'] = 200
retinfo['info'] = ' Handle a successful '
retinfo['result'] = ''
sqltext = config[DBSECTION]['getdimdict']
jsonstr = getsqlresultjson(db, sqltext, params)
retinfo['result'] = jsonstr
response = jsonify(retinfo)
response.status_code = 200
return response
Definition html Of base page -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 The home page is as follows :
Specifically api Like a document
Last , Thank you for your attention , Thank you for your support !
边栏推荐
- LeetCode 1986. The minimum working time to complete the task is one question per day
- typescript ts基础知识之tsconfig.json配置选项
- dapp丨defi丨nft丨lp单双币流动性挖矿系统开发详细说明及源码
- Pisa-Proxy SQL 解析之 Lex & Yacc
- skimage学习(1)
- Flask搭建api服务
- 如何选择合适的自动化测试工具?
- Skimage learning (2) -- RGB to grayscale, RGB to HSV, histogram matching
- Master this set of refined Android advanced interview questions analysis, oppoandroid interview questions
- LeetCode 1043. 分隔数组以得到最大和 每日一题
猜你喜欢
随机推荐
LeetCode 300. Daily question of the longest increasing subsequence
LeetCode 1981. Minimize the difference between the target value and the selected element one question per day
【饭谈】如何设计好一款测试平台?
LeetCode 1477. Find two subarrays with sum as the target value and no overlap
Sator推出Web3游戏“Satorspace” ,并上线Huobi
电脑无法加域,ping域名显示为公网IP,这是什么问题?怎么解决?
如何在博客中添加Aplayer音乐播放器
[designmode] proxy pattern
LeetCode 1774. 最接近目标价格的甜点成本 每日一题
运算符
Sator推出Web3游戏“Satorspace” ,并上线Huobi
LeetCode 312. Poke balloon daily
科普达人丨一文弄懂什么是云计算?
rpcms获取指定分类下的文章的方法
QML初学
Sator推出Web3遊戲“Satorspace” ,並上線Huobi
Talk about the realization of authority control and transaction record function of SAP system
LeetCode 1626. The best team without contradiction
直接上干货,100%好评
Interface oriented programming