我是 python Flask 新手,可能正在尝试以非预期的方式使用 Flask。
我可以从“父”路线呼叫 2 条路线吗?
@app.route("/parent_route")
# call route1 (by some means, this 'redirect' appears not to do anything)
x = redirect(url_for('/route1', methods=['GET']))
# call route2 (by some means), passing the output from route1
y = redirect(url_for('/route2', x=x, methods=['GET']))
# render the html page, passing the output from route2
return redirect(url_for("html_page", y=y))
@app.route("/route1", methods=['GET'])
# some processing, then ...
return x
@app.route("/route2/<x>", methods=['GET'])
# some processing, then ...
return y
Redirect 实际上并不保留在 Flask 中。它返回 HTTP 302 响应,客户端需要遵循该响应。有许多与此相关的警告。例如,POST 请求可能会变成 GET 并丢失其有效负载。这与 Flask 无关,而是 HTTP 和浏览器的运行方式。
做你想做的事情的简单而安全的方法是将公共代码提取到“常规”、可重用的 python 函数中。然后,您可以从任意数量的端点以任何顺序调用这些端点。
def handler_for_route1():
# Your logic for route1
return x
def handler_for_route2(x):
# Your logic for route2
return y
@app.route("/parent_route")
def parent_route():
x = handler_for_route1()
y = handler_for_route2(x=x)
return redirect(url_for("html_page", y=y))
@app.route("/route1", methods=['GET'])
def route1():
return handler_for_route1()
@app.route("/route2/<x>", methods=['GET'])
def route2(x):
return handler_for_route2(x=x)
请注意,API 函数本质上也只是函数。例如,您可以简单地从
route1()
内部调用 parent_route
。但是,您需要稍微小心为此调用提供的参数。 Flask 路由器将提供附加信息,例如请求对象,如果您不知道自己在做什么,最终可能会出现奇怪且难以调试的错误。
作为一般实践,我倾向于仅在 @app.route 函数中保留与请求相关的逻辑 - 例如处理身份验证、将请求参数重新整形为正确的内部数据类型等。我倾向于更喜欢的实际应用程序逻辑保留在代码的单独部分中的单独函数中。这将允许您从其他接口重用该代码,例如 ex.一个 CLI。当您无需担心构建 HTTP 请求时,它还可以让测试您的核心业务逻辑变得更加容易。