文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
自定义错误页面
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论