最近在学习flask的重定向中,使用到了url_for这个函数(最后放源代码),如下面的代码:
from flask import Flask, redirect
# 从flask中导入url_for
from flask import url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/user/<int:user_id>')
def demo1(user_id):
return 'demo1 %s' % user_id
#重定向
@app.route('/redirect')
def demo2():
# redirect() 跳转到某个页面
# url_for() 根据指定的函数,查找到对应的路由
return redirect(url_for('demo1', user_id='234'))
if __name__ == '__main__':
app.run(debug=True)
这里的url_for函数能够接受好多参数,第一个是需要一个函数名(这里是’demo1’),后面的是该函数所需要的参数(这里是user_id=‘234’)。
问题出在函数所需的参数,这里的参数必须是和demo1里面所带的形参相同,否则会报错,如下:
werkzeug.routing.BuildError:
Could not build url for endpoint 'demo1' with values ['users_id']. Did you forget to specify values ['user_id']?
问题就是:为什么url_for当中传入的参数,为什么一定要和函数demo1中的形参一样?
首先,源代码中url_for的注释中的翻译为:使用提供的方法生成指向给定端点的URL。目标端点未知的变量参数将作为查询参数附加到生成的URL。 如果查询参数的值为“None”,则跳过整个对。 如果蓝图处于活动状态,您可以通过在本地端点前加一个点(“.``”)来快捷引用同一蓝图。
这里的给定端点就是demo1,提供的方法暂时不管,生成的URL就是指向demo1的,同时也会将url_for中带给demo1的参数作为查询参数附加到URL,即user_id=‘234’会作为查询参数在URL内,注意,user_id也在其中,而不仅仅是将’234’带入,生成的URL经过路由匹配,会将其中的user_id带入demo1中,如果匹配不到demo1的形参的话,就会报错,不能以其他的参数构建demo1,认为没有导入所需的参数。
个人解读注释。
url_for源代码
def url_for(endpoint, **values):
"""Generates a URL to the given endpoint with the method provided.