路由定义
现代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')
。