Life with teacher Lemon.

Flask 开发笔记-路由进阶

2021.01.13 | 共 815 字,阅读需约 2 分钟.

上一节,我们对 Flask 路由做了一些介绍,理解了视图函数和路由的使用方法,接下来我们来学习路由的进阶部分:重定向、URL 构建

重定向

首先,我们来看一段代码,我们定义了两个视图函数并配置了路由信息,访问路径分别是 /api/about/

from flask import Flask
app = Flask(__name__)

@app.route('/api')
def api(name='Api'):
    return 'Hello {}'.format(name)
    
@app.route('/about/')
def about(name='About'):
    return 'Hello {}'.format(name)

使用 pipenv shell激活虚拟环境,执行命令 flask run 将我们的应用运行起来。

  • 访问 http://localhost:5000/api ,显示 Hello Api

  • 访问 http://localhost:5000/about,显示 Hello About

仔细观察一下,当你访问 /about时,浏览器地址栏会自动在后面加上斜杠而变成 /about/,而访问 /api 时则不会,如果手动在其后面加上斜杠,则会出现 Not Found,为什么?

我们使用 F12 打开浏览器的调试面板,切换到网络请求页面,再次访问上述地址

  • 访问 http://localhost:5000/about,会发现请求发生了 308 重定向后,自动加斜杠后返回 200
  • 而手动加上斜杠访问 http://localhost:5000/api/ ,则发现返回 404

总结一下

  • 路由不加尾部斜杠,用户自己加斜杠,访问会 404,不会重定向;
  • 路由末尾加斜杠,服务器接到不加末尾斜杠的请求时,会优先搜索是否存在对应名称为 about 的文件,如果找不到,则会进行重定向处理。

URL 构建

通常情况下,应用接到请求之后,会根据路由找到对应的视图函数,然后拿到视图函数的返回值信息。如果我们想在视图函数内反推路由信息,我们就需要用到 URL 构建函数 url_for。该函数的第一个参数为需要反推的函数名称,接受任意多个关键字参数,每个关键字参数对应 URL 中的变量,未知变量将作为查询参数。该函数的使用场景主要有:

  • 会对参数中的特殊字符进行转译
  • 路由信息易变更,使用 url_for 可以对函数名进行反转,减少硬编码
  • 指定静态文件

测试案例

from flask import Flask, url_for
app = Flask(__name__)

@app.route('/hello/<name>')
def hello(name='Lemon'):
    return 'Hello {}'.format(name)

@app.route('/api')
def api(name='Api'):
    # print(url_for('hello'))
    print(url_for('hello', name='world'))
    print(url_for('hello', name='Lemon Tree'))
    print(url_for('hello', name='Lemon', param='Tree'))
    return 'Hello {}'.format(name)

测试结果

# print(url_for('hello')) 测试不携带 name 参数会报错,但如果视图函数本身不带参数,多传入则不会
/hello/world
/hello/Lemon%20Tree
/hello/Lemon?param=Tree

对应静态文件 /static/style.css 的访问,有时也会使用如下的方式

url_for('static', filename='style.css')

OK,关于重定向和 URL 构建,就介绍到这里。

发表评论
今日诗词