Flask中的url_for是如何工作的?

1 投票
1 回答
2101 浏览
提问于 2025-04-18 16:14
flask.url_for(endpoint, **values)

我觉得这个 endpoint 的东西简直像魔法一样。它的表现方式有以下几点:

  1. 在一个文件里,一个被装饰过的方法 dothat 可以通过 url_for('dothat') 来获取。
  2. 使用 打包 的时候,views.dothat 也可以通过 url_for('dothat') 来获取,而我原本以为我必须提供这个方法的 完整名称,像这样 url_for('myapp.views.dothat')

那么,如果不是完整的方法名,Flask 到底是怎么理解这个 endpoint 的呢?

1 个回答

1

Flask 不会使用模块的名字作为端点,它默认使用的是函数的名字。

如果你在两个不同的模块中注册了两个同名的函数,就会出现一个 AssertionError 的错误:

raise AssertionError('View function mapping is overwriting an '
                     'existing endpoint function: %s' % endpoint)

在这种情况下,你可以指定一个明确的端点名字:

@app.route('/', endpoint='alt_homepage')
def homepage():
    pass

可以查看 @Flask.route() 的文档

endpoint – 注册的 URL 规则的端点。Flask 默认认为视图函数的名字就是端点。

当你用 @app.route() 装饰器注册一个视图时,端点名字会被确定(除非你自己设置一个),并和路由注册一起保存。url_for() 会利用路由注册的信息,找到所有与这个名字相关的路由,并根据你传给 url_for() 的参数,找到最合适的那个路由。

撰写回答