Python 使用url参数路由到不同的API端点
我正在Flask中开发API,其中一个要求是保持多个版本,以便最终用户能够在版本之间切换。我已经开始根据来自的建议(或答案)维护多个版本代码库,但我的问题是,是否有任何方法可以根据用户传入的参数将用户路由到不同的API版本,而不实际更改其端的url 例如:Python 使用url参数路由到不同的API端点,python,api,flask,versioning,Python,Api,Flask,Versioning,我正在Flask中开发API,其中一个要求是保持多个版本,以便最终用户能够在版本之间切换。我已经开始根据来自的建议(或答案)维护多个版本代码库,但我的问题是,是否有任何方法可以根据用户传入的参数将用户路由到不同的API版本,而不实际更改其端的url 例如: http://testapp.com/api?v=1.0 from flask import request from my_app.api.v1.views import index as v1_index from my_app.ap
http://testapp.com/api?v=1.0
from flask import request
from my_app.api.v1.views import index as v1_index
from my_app.api.v2.views import index as v2_index
.... other code ...
@app.route('/api')
def index():
api_version = request.args.get('v', '1.0')
if api_version == '1.0':
return v1_index()
elif api_version == '2.0':
return v2_index()
else:
return 'Unsupported API version.'
将路由到
http://testapp.com/1.0/api
http://testapp.com/2.0/api
及
将路由到
http://testapp.com/1.0/api
http://testapp.com/2.0/api
我知道在注册的blueprint中使用重定向(url_for(“####”)
可能可以解决这个问题,但在我的情况下并不理想(我希望保持相同的url而不重定向,但将来自不同版本api的响应相应地呈现到当前请求中)
如果我写得不清楚,请提前道歉 您仍然可以使用视图函数,而不是重定向到另一个路由,只需调用视图函数即可
例如:
http://testapp.com/api?v=1.0
from flask import request
from my_app.api.v1.views import index as v1_index
from my_app.api.v2.views import index as v2_index
.... other code ...
@app.route('/api')
def index():
api_version = request.args.get('v', '1.0')
if api_version == '1.0':
return v1_index()
elif api_version == '2.0':
return v2_index()
else:
return 'Unsupported API version.'
您仍然可以使用视图函数,而不是重定向到另一个路由,只需调用视图函数即可
例如:
http://testapp.com/api?v=1.0
from flask import request
from my_app.api.v1.views import index as v1_index
from my_app.api.v2.views import index as v2_index
.... other code ...
@app.route('/api')
def index():
api_version = request.args.get('v', '1.0')
if api_version == '1.0':
return v1_index()
elif api_version == '2.0':
return v2_index()
else:
return 'Unsupported API version.'
通过在每个请求之前检查请求url,可以在flask应用程序中执行此操作 您可以使用flask before_请求装饰器在每个请求之前运行代码 下面的代码将根据您的意愿重定向URL
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
@app.before_request
def check_url_and_redirect():
if request.path[1:] == 'api':
if request.args.get('v') == "1.0":
return redirect(url_for('v1'))
elif request.args.get('v') == "2.0":
return redirect(url_for('v2'))
@app.route("/")
def hello():
return "Hello World!"
@app.route("/1.0/api")
def v1():
return "This is V1"
@app.route("/2.0/api")
def v2():
return "This is V2"
if __name__ == "__main__":
app.run(debug=True)
通过在每个请求之前检查请求url,可以在flask应用程序中执行此操作 您可以使用flask before_请求装饰器在每个请求之前运行代码 下面的代码将根据您的意愿重定向URL
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
@app.before_request
def check_url_and_redirect():
if request.path[1:] == 'api':
if request.args.get('v') == "1.0":
return redirect(url_for('v1'))
elif request.args.get('v') == "2.0":
return redirect(url_for('v2'))
@app.route("/")
def hello():
return "Hello World!"
@app.route("/1.0/api")
def v1():
return "This is V1"
@app.route("/2.0/api")
def v2():
return "This is V2"
if __name__ == "__main__":
app.run(debug=True)
使用nginx和rewrite@reptilicus谢谢你的信息,我会调查的。另一方面,是否可以在应用程序级别执行此操作?通过使用rewrite@reptilicus谢谢你的信息,我会调查的。另一方面,是否可以在应用程序级别执行此操作?我最终也使用了此方法。重复。我最后也使用了这种方法。重复。