返回介绍

自定义错误页面

发布于 2025-01-02 21:53:51 字数 1778 浏览 0 评论 0 收藏 0

Flask 为应用提供了一个机制来自定义错误页面,这样用户就不必看到简单而枯燥的默认页面。 作为例子,让我们为 HTTP 的 404 错误和 500 错误(两个最常见的错误页面)设置自定义错误页面。 为其他错误设置页面的方式与之相同。

使用 @errorhandler 装饰器来声明一个自定义的错误处理器。 我将把我的错误处理程序放在一个新的 app/errors.py 模块中。

from flask import render_template
from app import app, db

@app.errorhandler(404)
def not_found_error(error):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
    db.session.rollback()
    return render_template('500.html'), 500

错误函数与视图函数非常类似。 对于这两个错误,我将返回各自模板的内容。 请注意这两个函数在模板之后返回第二个值,这是错误代码编号。 对于之前我创建的所有视图函数,我不需要添加第二个返回值,因为我想要的是默认值 200(成功响应的状态码)。 本处,这些是错误页面,所以我希望响应的状态码能够反映出来。

500 错误的错误处理程序应当在引发数据库错误后调用,而上面的用户名重复实际上就是这种情况。 为了确保任何失败的数据库会话不会干扰模板触发的其他数据库访问,我执行会话回滚来将会话重置为干净的状态。

404 错误的模板如下:

{% extends "base.html" %}

{% block content %}
    <h1>File Not Found</h1>
    <p><a href="{{ url_for('index') }}">Back</a></p>
{% endblock %}

500 错误的模板如下:

{% extends "base.html" %}

{% block content %}
    <h1>An unexpected error has occurred</h1>
    <p>The administrator has been notified. Sorry for the inconvenience!</p>
    <p><a href="{{ url_for('index') }}">Back</a></p>
{% endblock %}

这两个模板都从 base.html 基础模板继承而来,所以错误页面与应用的普通页面有相同的外观布局。

为了让这些错误处理程序在 Flask 中注册,我需要在应用实例创建后导入新的 app/errors.py 模块:

# ...

from app import routes, models, errors

如果在终端界面设置环境变量 FLASK_DEBUG=0 ,然后再次出发重复用户名的 BUG,你将会看到一个更加友好的错误页面。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文