1. redirect() 重定向
返回重定向响应,引导浏览器跳转到新URL。通常搭配 url_for() 使用:通过视图函数名反向解析路由地址,避免硬编码URL。
from flask import redirect, url_for
# 跳转到 login 视图对应的路由
return redirect(url_for('login'))Code language: PHP (php)
2. abort(状态码)
主动终止当前请求,抛出对应HTTP错误,abort之后的代码不会执行。abort(401) → 返回401未授权;
下面例子中的
this_is_never_executed()永远不会运行。
常见HTTP状态码:
401:未授权,禁止访问404:页面不存在403:权限不足
例子
from flask import Flask, abort, redirect, url_for, render_template
app = Flask(__name__)
@app.route('/')
def index():
# 访问首页,自动重定向到/login
return redirect(url_for('login'))
@app.route('/login')
def login():
# 主动抛出401错误
abort(401)
# abort后面代码无法执行
# this_is_never_executed()
# 自定义404错误页面处理器
@app.errorhandler(404)
def page_not_found(error):
# 返回渲染后的模板 + 指定HTTP状态码404
return render_template('page_not_found.html'), 404
if __name__ == '__main__':
app.run(debug=True)Code language: PHP (php)
执行流程
访问 http://127.0.0.1:5000/
- 执行
index()→redirect(url_for("login")) - 浏览器跳转至
/login - 执行
login()→abort(401),抛出401未授权 - 页面展示401错误信息
自定义错误页面
@app.errorhandler()
return render_template('page_not_found.html'), 404Code language: JavaScript (javascript)
- Flask视图默认返回200(请求成功);
- 第二个参数
404用于告诉浏览器本次响应是404未找到; - 如果不写
,404,页面虽然展示404文案,但是HTTP状态码仍然是200,不利于搜索引擎识别。
添加一个模板 templates/page_not_found.html 内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>页面不存在</title>
</head>
<body>
友好的错误提示:您访问的页面不存在!
</body>
</html>Code language: HTML, XML (xml)
总结
- abort() 直接中断函数执行
一旦调用abort(),后续代码不再运行,不要在abort后写业务逻辑。 - 不要手动调用错误处理函数
# 错误写法,不推荐
return page_not_found()
# 标准写法,使用abort触发
abort(404)Code language: PHP (php)
直接调用函数不会修改HTTP状态码,只是单纯渲染页面;abort() 才会触发错误处理器、正确响应状态码。
redirect默认302临时重定向;如需永久重定向:
return redirect(url_for('login'), code=301)Code language: JavaScript (javascript)
- 原生情况下,abort触发错误只会展示Flask默认黑白错误页;
@app.errorhandler(状态码)就是用来自定义美化错误页面。
Previous: Cookies
Next: Response 响应