Flask中的url_for是如何工作的?
flask.url_for(endpoint, **values)
我觉得这个 endpoint
的东西简直像魔法一样。它的表现方式有以下几点:
- 在一个文件里,一个被装饰过的方法
dothat
可以通过url_for('dothat')
来获取。 - 使用 打包 的时候,
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()
的参数,找到最合适的那个路由。