专否 写文章

BlackA,Talk is cheap,Show me the code.

Oct 23, 2018
Follow

Flask 学习笔记 #3 -- 路由与URL

前面使用了app.route装饰器将一个URL规则绑定到 一个视图函数上,在这一节我们将会学习定义路由的一般步骤,URL参数,URL反转以及重定向。

1、定义路由规则

在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)

2、URL传参

我们可以使用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 字符串

3、url反转

反转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() 会为你妥善处理。

4、url重定向

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)

下面是程序的执行结果:


喜欢这个文章 | 分享 | 新建跟帖