BlackA,Talk is cheap,Show me the code.
前面使用了app.route装饰器将一个URL规则绑定到 一个视图函数上,在这一节我们将会学习定义路由的一般步骤,URL参数,URL反转以及重定向。
在flask应用中,路由是指用户请求的URL与视图函数之间的映射。flask框架根据请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数, 并将视图函数的执行结果返回WSGI服务器:
flask使用app.route装饰器将一个URL规则绑定到一个视图函数上,即在路由表中添加一条记录。
@app.route('/') def index(): return "HelloWorld"
@app.route其实是add_url_rule()函数的语法糖,我们也可以使用下面的代码实现相同的功能:
def index(): return "HelloWolrd" app.add_url_rule('/',view_func = index)
我们可以使用URL参数来匹配一系列URL,在flask中使用URL参数非常简单,只需要用尖括号<>将需要匹配的参数括起来,然后在视图函数中添加与URL参数同名的参数:
@app.route('/article/<id>') def article(id): return "你选择的文章id为:" + str(id)
还可以通过在参数前面添加转换器实现对某一类参数的接受,当传递的URL参数类型符合时接受,当类型不符合时产生一个404 Not Found错误:
@app.route('/article/<int:id>') def article(id): return "你选择的文章id为:" + str(id)
下表列出了flask支持的转换器类型:
# string (缺省值)接受任何不包含斜杠的文本 # int 接受正整数 # float 接受正浮点数 # path 类似 string ,但可以包含斜杠 # uuid 接受 UUID 字符串
反转URL是指从视图函数到URL的转换,说白了就是通过的视图函数得到视图函数对应的URL的过程,url_for函数可以实现URL反转,它把函数名称作为第一个参数,可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量或URL中的查询参数( ‘ ? ’ 后面的部分),下面的例子展示了url_for的使用方法:
# 1、使用url_for的第一步是导入这个函数 from flask import Flask,url_for app = Flask(__name__) @app.route('/') def index(): return "In index!" @app.route("/login") def login(): return "In login!" @app.route("/article/<id>") def article(id): return "In article:" + id @app.route("/show/") def show(): # 2、将视图函数名以字符串的形式传递给url_for,url_for会返回函数对应的url print(url_for("index") + '\n') print(url_for("login") + '\n') # 3、对于带参数的URL,把对应参数的值以关键字参数的形式传递给url_for print(url_for("article",id = 123) + '\n') # 4、如果给出的关键字参数不是对应的URL参数,将把这个关键字参数作为查询参数添加到URL中 print(url_for("login",user_name = "aaa",password = "111") + '\n') # 5、url_for可以正确的处理空格等字符的URL编码问题 print(url_for("article",id = "aaa bbb",user = "blacka") + '\n') return "In show" if __name__ == "__main__": app.run()
下面是这个程序的运行结果:
为什么不使用硬编码URL,而是使用url_for去动态的构建呢?使用url_for主要有下面几个好处:
* 反转通常比硬编码 URL 的描述性更好。 * 你可以只在一个地方改变 URL ,而不用到处乱找。 * URL 创建会为你处理特殊字符的转义和 Unicode 数据,比较直观。 * 生产的路径总是绝对路径,可以避免相对路径产生副作用。 * 如果你的应用是放在 URL 根路径之外的地方url_for() 会为你妥善处理。
URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。 比如:我们都知道京东的url是www.jd.com,但是当你输入www.jingdong.com时候,你会发现地址自动跳转到了www.jd.com,这里使用的技术就是重定向。
重定向分为永久重定向和临时重定向,像京东这种只要你输入www.jingdong.com就会跳转到另一个地址的情况就叫做永久重定向,也就是说京东不希望你再用这个地址了;而临时重定向则可能是判断你的登录状态,比如有一些网站你进入后会判断你是否登录,如果登录就跳转页面article,如果没登录就跳转页面login,这种就是临时重定向的情况。
flask中使用 redirect 函数实现页面重定向,这个函数接受三个参数:
redirect(location , code=302 , Response=None)
其中location表示要跳转到的URL,一般用url_for函数动态的获取。code表示返回给用户的 http 状态码,默认为302,表示临时重定向,另外301表示永久重定向,其余的不常用,如果感兴趣可以参考MDN,Response用来初始化响应对象。
下面是一个例子,当用户访问 article 的时候,我们会检查他请求的URL的 is_login 参数,如果用户已经登录,is_login 的值为 1,跳转到 article 页面,反之 is_login 为 0 ,跳转到登录页面:
# 先导入redirect函数 from flask import Flask,url_for,redirect app = Flask(__name__) # 登录页面 @app.route("/login/") def login(): return "In login!" # 当is_login为1时,返回文章列表,否则跳转到登录页面, # 因为我们还没有学get和post方法,所以这里用url参数模拟登录过程 @app.route("/article/<int:is_login>/") def article(is_login): if is_login == 1: return "In article!" else: # redirect函数常与url_for函数搭配使用 return redirect(url_for("login")) if __name__ == "__main__": app.run(debug = True)
下面是程序的执行结果: