重定向和错误提示页

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/

  1. 执行 index()redirect(url_for("login"))
  2. 浏览器跳转至 /login
  3. 执行 login()abort(401),抛出401未授权
  4. 页面展示401错误信息

自定义错误页面

@app.errorhandler()

return render_template('page_not_found.html'), 404Code language: JavaScript (javascript)
  1. Flask视图默认返回200(请求成功)
  2. 第二个参数 404 用于告诉浏览器本次响应是404未找到
  3. 如果不写 ,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)

总结

  1. abort() 直接中断函数执行
    一旦调用 abort(),后续代码不再运行,不要在abort后写业务逻辑。
  2. 不要手动调用错误处理函数
#  错误写法,不推荐
return page_not_found()
# 标准写法,使用abort触发
abort(404)Code language: PHP (php)

直接调用函数不会修改HTTP状态码,只是单纯渲染页面;abort() 才会触发错误处理器、正确响应状态码。

  1. redirect 默认302临时重定向;如需永久重定向:
return redirect(url_for('login'), code=301)Code language: JavaScript (javascript)
  1. 原生情况下,abort触发错误只会展示Flask默认黑白错误页;
    @app.errorhandler(状态码) 就是用来自定义美化错误页面

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注