如果Flask能匹配URL,那么Flask可以生成它们吗?当然可以。你可以用url_for()来给指定的函数构造URL。它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。未知变量部分会添加到URL末尾作为查询参数。这里有一些例子:

    1. from flask import Flask, url_for
    2. app = Flask(__name__)
    3. @app.route('/')
    4. def index():
    5. pass
    6. @app.route('/login')
    7. def login():
    8. pass
    9. @app.route('/user/<username>')
    10. def profile(username):
    11. pass
    12. with app.test_request_context():
    13. print(url_for('index'))
    14. print(url_for('login'))
    15. print(url_for('login', next='/'))
    16. print(url_for('profile', username='John Doe'))
    17. 结果
    18. /
    19. /login
    20. /login?next=/
    21. /user/John%20Doe

    为什么你要构建URL而非在模板中硬编码?这里有三个绝妙的理由:

    1. 反向构建通常币硬编码的描述性更好。更重要的是,它允许你一次性修改URL,而不是到处边找边改。
    2. URL构建会转义特殊字符和Unicode数据,免去你很多麻烦。
    3. 如果你的应用不位于URL的根路径(比如,在/myapplication下,而不是/),url_for()会妥善处理这个问题