Python Flask 调用不同版本 API
Python Flask calling different version API
我是 Python Flask 的新手,我在版本控制 API 设计方面遇到问题。考虑 URL 对用户 API.
执行 GET 方法
v1 - <URL>/api/v1/users?q=getUserInfo?name=ryan
v2 - <URL>/api/v2/users?q=getUserInfo?name=ryan&gender=male
虽然v1和v2中的'user'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 文件和 return 对客户端的响应?
请注意,并非必须对所有资源进行版本控制。
当我们在单个服务器节点(或微服务)中支持不同版本的端点时 - 我们通常称它们为 "coexisting endpoints".
如果您决定将 API 版本作为动态请求参数 <version>
传递,则必须实现自定义调度程序 load/apply 每个版本的不同处理程序。
支持共存端点的一种更简单的方法是为每个版本注册不同的路由。
而 Sanic server allows to pass the version keyword to the route decorators, or to a blueprint initializer, in Flask you could apply simple 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 设计方面遇到问题。考虑 URL 对用户 API.
执行 GET 方法v1 - <URL>/api/v1/users?q=getUserInfo?name=ryan
v2 - <URL>/api/v2/users?q=getUserInfo?name=ryan&gender=male
虽然v1和v2中的'user'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 文件和 return 对客户端的响应?
请注意,并非必须对所有资源进行版本控制。
当我们在单个服务器节点(或微服务)中支持不同版本的端点时 - 我们通常称它们为 "coexisting endpoints".
如果您决定将 API 版本作为动态请求参数 <version>
传递,则必须实现自定义调度程序 load/apply 每个版本的不同处理程序。
支持共存端点的一种更简单的方法是为每个版本注册不同的路由。
而 Sanic server allows to pass the version keyword to the route decorators, or to a blueprint initializer, in Flask you could apply simple 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)