如果Flask能匹配URL,那么Flask可以生成它们吗?当然可以。你可以用url_for()来给指定的函数构造URL。它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。未知变量部分会添加到URL末尾作为查询参数。这里有一些例子:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
pass
@app.route('/login')
def login():
pass
@app.route('/user/<username>')
def profile(username):
pass
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
结果
/
/login
/login?next=/
/user/John%20Doe
为什么你要构建URL而非在模板中硬编码?这里有三个绝妙的理由:
- 反向构建通常币硬编码的描述性更好。更重要的是,它允许你一次性修改URL,而不是到处边找边改。
- URL构建会转义特殊字符和Unicode数据,免去你很多麻烦。
- 如果你的应用不位于URL的根路径(比如,在/myapplication下,而不是/),url_for()会妥善处理这个问题