首页 > 解决方案 > 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.pyAPI 处理产品请求,<version>/cart.pyAPI 处理购物车请求等。

所以问题是,我应该如何调用我不同版本的 API 文件并将响应返回给客户端?

标签: pythonapiflaskversioning

解决方案


请注意,并非必须对所有资源进行版本控制。
当我们在单个服务器节点(或微服务)中支持不同版本的端点时——我们通常称它们为“共存端点”
如果您决定将 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)    

推荐阅读