python - Python Flask 调用不同版本的 API
问题描述
我是 Python Flask 的新手,我遇到了版本控制 API 设计的问题。考虑对用户 API 执行 GET 方法的 URL。
v1 - <URL>/api/v1/users?q=getUserInfo?name=ryan
v2 - <URL>/api/v2/users?q=getUserInfo?name=ryan&gender=male
虽然 v1 和 v2 中的“用户”API 在开发期间可能有不同的实现,但客户端会针对不同的请求调用不同版本的 API,并且 API 会根据 API 调用做出不同的响应。当用户调用不同的 API 时,我应该如何将客户端路由到相应版本的 API?
这是我的 server.py:
from flask import Flask, request
import sys
sys.path.insert(0, '../api')
app = Flask(__name__)
@app.route('/api/<version>/<api>/<action>')
def api(version, api, action):
# How should I call my API and get return data to the client?
return json.dumps(return_info)
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port='8081')
在我的 api/v1/user.py
def getUserInfo(name):
# some logic and return user info
在我的 api/v2/user.py
def getUserInfo(name, gender):
# some logic and return user info
基本思想是 server.py 根据客户端的请求和对客户端的响应充当不同版本 API 的中心路由。
此外,不同版本的 API 包含多个.py
用于模块化设计的文件,例如:<version>/product.py
API 处理产品请求,<version>/cart.py
API 处理购物车请求等。
所以问题是,我应该如何调用我不同版本的 API 文件并将响应返回给客户端?
解决方案
请注意,并非必须对所有资源进行版本控制。
当我们在单个服务器节点(或微服务)中支持不同版本的端点时——我们通常称它们为“共存端点”。
如果您决定将 API 版本作为动态请求参数传递,<version>
则必须实现自定义调度程序来为每个版本加载/应用不同的处理程序。
支持共存端点的一种更简单的方法是为每个版本注册不同的路由。
虽然Sanic服务器允许将version关键字传递给路由装饰器或蓝图初始化器,但在 Flask 中,您可以应用简单的蓝图:
...
# import <needed_features> from api/v1/user.py
# import <needed_features> from api/v2/user.py
...
bp_api_v1 = Blueprint('api_v1', __name__, url_prefix='/api/v1')
bp_api_v2 = Blueprint('api_v2', __name__, url_prefix='/api/v2')
app.register_blueprint(bp_api_v1)
app.register_blueprint(bp_api_v2)
@bp_api_v1.route('/users/<action>')
def api(request, action):
# call getUserInfo from api/v1/user.py
user_info = getUserInfo(request.args.get('name'))
return json.dumps(user_info)
@bp_api_v2.route('/users/<action>')
def api(request, action):
# call getUserInfo from api/v2/user.py
user_info = getUserInfo(request.args.get('name'))
return json.dumps(user_info)
推荐阅读
- go - GoLang 接口名称及其方法数量的规则
- c# - C# 系统命名空间 - 为什么我需要导入它?
- sql-server - cte1 是无效的对象名称
- xml - SaxonEE:9.8 ClassNotFoundException:执行 saxonValidator.validate 时 AtomicTypeValidator
- bash - 从枚举的文件名中减去数字
- c# - 为什么没有过滤数据库中的数据?
- sqlite - 在新的应用程序版本中替换数据库
- mongodb - 无法从 kubernetes 集群连接到 mongodb atlas 集群
- python - 根据源-目的字典计算源路径
- postgresql - 兼容性 regexp_replace() postgres 和 h2