【问题标题】:Flask: get current routeFlask:获取当前路线
【发布时间】:2014-02-25 05:55:47
【问题描述】:

在 Flask 中,当我有多个相同功能的路由时, 我怎么知道当前使用的是哪条路线?

例如:

@app.route("/antitop/")
@app.route("/top/")
@requires_auth
def show_top():
    ....

我怎么知道,现在路由是使用/top//antitop/ 调用的?

更新

我知道request.path 我不想使用它,因为请求可能相当复杂,我想在函数中重复路由逻辑。我认为url_rule 的解决方案是最好的。

【问题讨论】:

标签: python url flask


【解决方案1】:

只需使用request.path

from flask import request

...

@app.route("/antitop/")
@app.route("/top/")
@requires_auth
def show_top():
    ... request.path ...

【讨论】:

  • 投票只是因为您对导入语句感到困扰。
  • @MichaelScheper 同意,任何类型代码的许多代码 sn-ps 都不包含导入语句
【解决方案2】:

通过request.url_rule 来检查触发您的视图的最“简单”的方法是。

from flask import request

rule = request.url_rule

if 'antitop' in rule.rule:
    # request by '/antitop'

elif 'top' in rule.rule:
    # request by '/top'

【讨论】:

  • 这是一个很好的解决方案,但请考虑 @marcinkuzminski 的解决方案。我认为它更优雅。
  • 如果路由是variable rule@app.route('/user/<username>'),则此操作失败
  • @gerardw request.url_rule.rule 就是这样。它会根据需要返回 /user/<username>
【解决方案3】:

另一种选择是使用端点变量:

@app.route("/api/v1/generate_data", methods=['POST'], endpoint='v1')
@app.route("/api/v2/generate_data", methods=['POST'], endpoint='v2')
def generate_data():
    version = request.endpoint
    return version

【讨论】:

  • 用点而不是斜线显示路线。即subunit.page 而不是/subunit/page
【解决方案4】:

如果您希望每个路由具有不同的行为,正确的做法是创建两个函数处理程序。

@app.route("/antitop/")
@requires_auth
def top():
    ...

@app.route("/top/")
@requires_auth
def anti_top():
    ...

在某些情况下,您的结构是有意义的。您可以为每条路线设置值。

@app.route("/antitop/", defaults={'_route': 'antitop'})
@app.route("/top/", defaults={'_route': 'top'})
@requires_auth
def show_top(_route):
    # use _route here
    ...

【讨论】:

    【解决方案5】:

    在我看来,如果您遇到重要的情况,您一开始就不应该使用相同的功能。将其拆分为两个单独的处理程序,每个处理程序调用共享代码的共同虚构。

    【讨论】:

    • 我认为url_rule 的解决方案是最好的,但还是谢谢你+1
    猜你喜欢
    • 2015-12-04
    • 2014-09-10
    • 1970-01-01
    • 2015-09-14
    • 2015-10-08
    • 2017-07-21
    • 2016-09-26
    • 2016-04-08
    • 2019-07-15
    相关资源
    最近更新 更多