自定义错误页面 — Flask 文档

来自菜鸟教程
Flask/docs/1.1.x/patterns/errorpages
跳转至:导航、​搜索

自定义错误页面

Flask 带有一个方便的 abort() 函数,可以提前中止带有 HTTP 错误代码的请求。 它还将为您提供一个简单的黑白错误页面,其中包含基本描述,但没什么特别的。

根据错误代码,用户实际看到此类错误的可能性较小或较大。

常见错误代码

以下错误代码是一些经常向用户显示的错误代码,即使应用程序运行正常:

404 未找到
好老的“伙计,你打错了那个 URL”的消息。 如此普遍,即使是互联网新手也知道 404 意味着:该死,我要找的东西不存在。 确保 404 页面上确实有一些有用的东西,至少是指向索引的链接,这是一个非常好的主意。
403 禁地
如果您的网站上有某种访问控制,则必须为不允许的资源发送 403 代码。 因此,请确保用户在尝试访问被禁止的资源时不会丢失。
第410章
你知道“404 Not Found”有一个叫“410 Gone”的兄弟吗? 很少有人真正实现这一点,但这个想法是以前存在的资源被删除了,答案是 410 而不是 404。 如果您不是从数据库中永久删除文档,而只是将它们标记为已删除,请帮用户一个忙,改用 410 代码并显示一条消息,表明他们正在寻找的内容已被永久删除。
500内部服务器错误
通常发生在编程错误或服务器过载时。 一个非常好的主意是在那里有一个漂亮的页面,因为您的应用程序 迟早会 失败(另请参阅: 应用程序错误 )。


错误处理程序

错误处理程序是一个函数,它在引发某种类型的错误时返回响应,类似于视图是一个在请求 URL 匹配时返回响应的函数。 它传递了正在处理的错误实例,这很可能是 HTTPException。 除了明确的 500 错误之外,“500 内部服务器错误”的错误处理程序还将传递未捕获的异常。

错误处理程序使用 errorhandler() 装饰器或 register_error_handler() 方法注册。 可以为状态代码(如 404)或异常类注册处理程序。

响应的状态代码不会设置为处理程序的代码。 从处理程序返回响应时,请确保提供适当的 HTTP 状态代码。

在调试模式下运行时,不会使用“500 Internal Server Error”的处理程序。 相反,将显示交互式调试器。

以下是“404 Page Not Found”异常的示例实现:

from flask import render_template

@app.errorhandler(404)
def page_not_found(e):
    # note that we set the 404 status explicitly
    return render_template('404.html'), 404

使用 应用程序工厂模式 时:

from flask import Flask, render_template

def page_not_found(e):
  return render_template('404.html'), 404

def create_app(config_filename):
    app = Flask(__name__)
    app.register_error_handler(404, page_not_found)
    return app

示例模板可能是这样的:

{% extends "layout.html" %}
{% block title %}Page Not Found{% endblock %}
{% block body %}
  <h1>Page Not Found</h1>
  <p>What you were looking for is just not there.
  <p><a href="{{ url_for('index') }}">go somewhere nice</a>
{% endblock %}

将 API 错误作为 JSON 返回

将 Flask 用于 Web API 时,您可以使用与上述相同的技术将 JSON 响应返回到 API 错误。 abort() 使用 description 参数调用。 errorhandler() 将使用它作为 JSON 错误消息,并将状态代码设置为 404。

from flask import abort, jsonify

@app.errorhandler(404)
def resource_not_found(e):
    return jsonify(error=str(e)), 404

@app.route("/cheese")
def get_one_cheese():
    resource = get_resource()

    if resource is None:
        abort(404, description="Resource not found")

    return jsonify(resource)