在3.3节中执行redirect("/login")函数,让页面跳转到登录页面,这里是直接把/login这个URL硬编码进去的,对于项目健壮性不太友好,更好的方式应该是通过url_for函数来动态地构造URL。url_for接收视图函数名作为第1个参数,以及其他URL定义时的参数,如果还添加了其他参数,则会添加到URL的后面作为查询字符串参数。这里以博客详情的URL为例来讲解url_for函数的使用,示例代码如下。
@app.route("/blog/<int:blog_id>") def blog_detail(blog_id): return "您查找的博客id为:%s"%blog_id @app.route("/urlfor") def get_url_for(): url = url_for("blog_detail",blog_id=2,user="admin") return url
在get_url_for视图函数中使用了url_for函数,把函数名blog_detail作为第1个参数,因为blog_detail的URL需要接收一个blog_id参数,因此把blog_id也传给了url_for函数。除此之外,还添加了一个user参数,因为user参数不是必需的,所以在构建成URL后,会把user作为查询字符串参数拼接上去。在浏览器中访问/urlfor,可以看到如图3-13所示的效果。
图3-13 访问/urlfor
相比在代码中硬编码URL,使用url_for函数来动态地构建URL有以下两点好处。
URL是对外的,可能会经常变化,但是视图函数不会经常变化。如果直接把URL硬编码,若后期URL改变了,凡是硬编码了这个URL的代码都需要修改,费时费力。
URL在网络之间通信的过程中,需要把一些特殊字符包括中文等进行编码,如URL中包含了特殊字符,用url_for函数会自动进行编码,省时省力。