【问题标题】:Flask using url parameter to route to different API endpointFlask 使用 url 参数路由到不同的 API 端点
【发布时间】:2016-02-12 16:22:37
【问题描述】:

我正在开发 Flask 中的 API,其中一项要求是保留多个版本,以便最终用户能够在版本之间切换。我已经开始根据this thread 的推荐(或答案)维护多个版本代码库,但我的问题是,是否有路由用户仅根据他们传入的参数访问不同的 API 版本而不实际更改 url在他们的最后。

例如:

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('###')) 可能可以解决这个问题,但在我的情况下并不理想(我想保留相同的 url 而不重定向但将来自不同版本 api 的响应相应地呈现到当前请求中)

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

【问题讨论】:

  • 你可以很容易地使用 nginx 使用重写来做到这一点
  • @reptilicus 感谢您的信息,我会调查的。另一方面,是否可以在应用程序级别上做?

标签: python api flask versioning


【解决方案1】:

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


例如:

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

【讨论】:

  • 我最终也使用了这种方法。重复。
【解决方案2】:

您可以在您的烧瓶应用程序中执行此操作,方法是在每个请求之前检查请求 url。

您可以使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多