路由定义

现代Web框架都是将处理函数(视图函数)绑定在指定URL上的,Flask也不例外。Flask的路由定义通过Flask实例的route()修饰器来定义。格式为@app.route(url, methods=[]),其中methods中可以使用字符串'GET''POST'等来设置处理函数能够响应的HTTP谓词。

路径参数

在前面aiohttp中曾经提到过,路由可以接受路径参数,Flask的路由同样也可以接受路径参数。路径参数的定义格式为<转换器:参数名>,设定的参数可以在处理函数的参数表中使用同名参数接收。例如:

@app.route('/post/<int:post_id>')
def show_post(post_id):
	return 'Post {0:d}".format(post_id)

Flask对于路径参数可以使用的转换器有以下几个:

  • string,默认转换器,用于接收字符串但不包含任何斜线。
  • int,接收正值整型。
  • float,接收正值浮点型。
  • path,接收字符串,但包含斜线。
  • uuid,接收UUID字符串。

URL定义

Flask对于路由路径定义中的斜线是有特殊处理的,不同的定义格式产生的效果不同。假如有以下两个路由定义。

@app.route('/projects/')
def projects():
	return 'The project page'

@app.route('/about')
def about():
	return 'The about page'

其中/projects/是带有尾部的斜线的,这会让它像一个目录一样运作,当你访问不带斜线的/projects时,Flask会将你转向至带斜线的URL上。但是尾部不带斜线的/about则像是一个文件一样,如果带上斜线,例如/about/,就会报404错误。

URL组装

很多情况下,项目需要将跳转链接输出到模板上,或者直接进行跳转。Flask提供了一个快速组装URL的途径:url_for()函数。它的第一个参数为使用@app.route()绑定路由路径的函数名称(字符串类型),其后需要使用命名参数来组成路由路径中的路径参数,或者是Query参数。

借用官方示例:

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')
def index():
	return 'index'

@app.route('/login')
def login():
	return 'login'

@app.route('/user/<username>')
def profile(username):
	return '{}\'s profile'.format(username)

with app.test_request_context():
	print(url_for('index')) # 输出/
	print(url_for('login')) # 输出/login
	print(url_for('login', next='/')) # 输出/login?next=/
	print(url_for('profile', username='John Doe')) # 输出/user/John%20Doe

对于静态文件URL的组装,可以使用'static'来作为第一个参数,即url_for('static', filename='style.css')