在 Flask 开发中,url_for()
与 redirect()
是实现路由跳转逻辑的核心工具。
url_for()
负责安全、灵活地生成 URL。
redirect()
负责发起重定向响应。
url_for()
:生成URLurl_for(endpoint, **values)
是 Flask 提供的 URL 构造工具,可根据路由端点(即视图函数名)动态生成对应路径。
那么这里的“路由端点”是哪来的呢?
通过“路由装饰器”生成的Rule
对象,保存在app.url_map
里的。
关于Flask路由装饰器,可以看这一篇:Flask 路由装饰器:从 URL 到视图函数的优雅映射
url_for(endpoint, **values)
endpoint
:视图函数名(字符串)**values
:动态参数、查询参数、特殊参数(如 _external
, _anchor
)避免硬编码 URL 路径,提高代码维护性:
url_for('home') # -> '/home'
支持绑定动态路由参数,灵活生成对应路径:
url_for('profile', username='alice') # -> '/user/alice'
支持附加查询参数,方便传递额外信息:
url_for('profile', username='alice', page=2) # -> '/user/alice?page=2'
适合需要外部访问或邮件链接场景,生成完整 URL:
url_for('profile', username='alice', _external=True) # -> 'http://localhost/user/alice'
支持 URL 片段定位,增强用户体验:
url_for('home', _anchor='top') # -> '/home#top'
redirect()
:页面重定向redirect(location, code=302)
是 Flask 提供的重定向函数,用于生成重定向响应,提示客户端跳转到新的 URL。
redirect(location, code=302)
location
:目标 URL
/home
)、绝对路径(如 http://example.com
),或通过 url_for()
构造而得。code
:HTTP 状态码,默认是 302
,表示临时重定向。
302
(默认):临时重定向,常用于普通页面跳转。301
:永久重定向,适用于 URL 变更。303
:明确告知浏览器用 GET 请求访问重定向目标,适合 POST 请求后的跳转,规范避免了 302 状态下浏览器不一致的行为。307
:保持原请求方法(如 POST 仍为 POST),用于需要严格保留请求语义的场景(如 API 调用)。HTTP 状态码
303
和307
都是在HTTP/1.1 标准(RFC 2616)
中首次引入的,用于补充和细化原本模糊不清的302
重定向行为。
from flask import redirect
@app.route('/old')
def old():
return redirect('/new') # 临时重定向到 /new,默认状态码 302
@app.route('/submit', methods=['POST'])
def submit():
# 处理表单后用 303 重定向,确保浏览器用 GET 请求跳转
return redirect(url_for('success'), code=303)
@app.route('/external')
def external():
return redirect('https://example.com', code=301) # 永久重定向到外部链接
以下是一个实际场景:主页判断用户是否已登录,并进行相应跳转。
@app.route('/')
def index():
if 'username' in session:
return redirect(url_for('profile')) # 登录后跳转到个人页面
return redirect(url_for('login'))
这个例子体现了 url_for
与 redirect
的协同作用:
url_for('profile')
与 url_for('login')
提供灵活、安全的 URL 构造。redirect(...)
返回重定向响应,引导客户端跳转。