Python Flask调用不同版本API

标签 python api flask versioning

我是 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 中您可以应用简单的 blueprints :

...
# 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)    

关于Python Flask调用不同版本API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57018744/

相关文章:

python - paramiko 没有现有的 session 异常

python - hash() 如何计算元组的哈希值?

api - 谷歌路线优化

python - flask db migrate 不要更改列设置

python - Flask sqlalchemy 更新错误 - update() 缺少 1 个必需的位置参数 : 'self'

python - Python 的 splat 运算符是……在某一时刻吗?

python - 递归引用列表本身

javascript - 如何使用 OAuth2 从 linkedin 获取最近的公司更新

javascript - 如何将 api 添加到 Visual Studio Code

python - Flask 应用程序中的 Zerorpc 在 apache 服务器中启动时无法工作,但在由 pycharm 启动时工作正常