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

时间:2016-02-12 16:22:37

标签: python api flask versioning

我正在使用Flask中的API,其中一个要求是保留多个版本,以便最终用户能够在不同版本之间切换。我已经开始根据来自this thread的推荐(或回答)维护多个版本代码库,但我的问题是,无论如何路由用户只是根据他们传入的参数来命中不同的API版本而不实际改变他们的网址。

例如:

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

将路由到

http://testapp.com/1.0/api

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

将路由到

http://testapp.com/2.0/api

我明白使用注册蓝图的redirect(url_for('###'))可能可以解决这个问题,但在我的情况下并不理想(我想保留相同的网址而不重定向,但将不同版本的api的响应呈现为当前请求)

如果我的写作不清楚,请提前道歉。

2 个答案:

答案 0 :(得分:2)

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

例如:

@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
private Drawable getDrawableForSdkVersion(int resId, Resources res) {

    Drawable drawable = null;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
        drawable = res.getDrawable(resId, null);
    } else {
        drawable = res.getDrawable(resId);
    }

    return drawable;

}

答案 1 :(得分:1)

您可以在每个请求之前检查请求网址,在烧瓶应用程序中执行此操作。

您可以使用flask before_request装饰器在每个请求之前运行代码。

下面的代码会根据您的意愿重定向网址

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)