使用url参数路由到不同API端点的Flask

2024-04-24 03:10:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Flask中开发一个API,其中一个要求是保持多个版本,这样最终用户就能够在不同版本之间切换。我已经开始根据this thread的建议(或答案)来维护多个版本代码库,但我的问题是,是否有任何方法可以根据用户传入的参数来路由用户访问不同的API版本,而不会实际更改其端部的url。在

例如:

http://testapp.com/api?v=1.0

将路由到

^{pr2}$

以及

http://testapp.com/api?v=2.0

将路由到

http://testapp.com/2.0/api

我知道在注册的blueprint中使用redirect(url_for('###'))可能可以解决这个问题,但在我的情况下并不理想(我希望保持相同的url,而不重定向,而是将来自不同版本api的响应相应地呈现到当前请求中)

如果我的文字不清楚,请提前道歉。在


Tags: 答案代码用户版本comapihttpurl
2条回答

您可以在flask应用程序中通过在每个请求之前检查请求url来实现这一点。在

您可以使用flask before-request-decorator在每个请求之前运行一个代码。在

下面的代码将按您的意愿重定向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)

您仍然可以使用视图函数,而不是重定向到另一个路由,只需调用视图函数。在


例如:

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.'

相关问题 更多 >