代码之家  ›  专栏  ›  技术社区  ›  Martin Thoma

@app.route()的“endpoint”参数用于什么?

  •  0
  • Martin Thoma  · 技术社区  · 5 年前

    在Flask中,您可以创建如下路线:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/foobar")
    def foo_bar_endpoint():
        ...
    

    但路线装饰师也有一个 endpoint 参数。这个 documentation 只是陈述:

    已注册URL规则的端点。Flask本身假定视图函数的名称为端点

    为什么不应该简单地将函数命名为应该调用的端点?这与其他事情有关吗 url_for ?

    0 回复  |  直到 5 年前
        1
  •  1
  •   deceze    5 年前

    “端点”是您提供的任意名称,它基本上是路由引用的规范名称。您实际上并没有将URL映射到那里的函数,而是将URL映射至端点,并将视图函数附加到该端点。

    URL → endpoint → function
    

    您只需在一个操作中完成所有这些操作,函数的名称就会自动成为流程中端点的名称。但你 能够 分别执行这些操作,并为URL注册一个端点,然后将函数附加到该端点:

    基本上这个例子:

    @app.route('/')
    def index():
        pass
    

    相当于以下内容:

    def index():
        pass
    app.add_url_rule('/', 'index', index)
    

    如果 view_func 如果没有提供,您需要将端点连接到视图函数,如下所示:

    app.view_functions['index'] = index
    

    https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.add_url_rule

    如果您对函数名称有一些限制,但已经从其他地方引用了端点,特别是在重构过程中,您可能希望独立于函数来命名端点,这可能是一个相关的例子。

        2
  •  0
  •   Vladimir    5 年前

    这个 URL 用于外部客户端,用于HTTP请求。

    这个 endpoint 如果您需要知道重定向哪个URL,例如无需任何硬编码,则可用于内部使用。

    如果你没有定义端点,你的代码看起来像:

    blueprint = Blueprint("bp_1", __name__)
    
    
    @blueprint.route("/foobar")
    def foo_bar_endpoint():
        ...
    
    
    url = flask.url_for("bp_1.foo_bar_endpoint")
    

    如果定义了端点,则使用函数 url_for 其名称:

    @blueprint.route("/foobar", endpoint="custom_name")
    def foo_bar_endpoint():
        ...
    
    
    url = flask.url_for("bp_1. custom_name")