返回介绍

Flask 中的错误处理机制

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

在 Flask 应用中爆发错误时会发生什么? 得到答案的最好的方法就是亲身体验一下。 启动应用,并确保至少有两个用户注册,以其中一个用户身份登录,打开个人主页并单击“编辑”链接。 在个人资料编辑器中,尝试将用户名更改为已经注册的另一个用户的用户名,boom!(爆炸声) 这将带来一个可怕的“Internal Server Error”页面:

如果你查看运行应用的终端会话,将看到 stack trace (堆栈跟踪)。 堆栈跟踪在调试错误时非常有用,因为它们显示堆栈中调用的顺序,一直到产生错误的行:

(venv) $ flask run
 * Serving Flask app "microblog"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[2017-09-14 22:40:02,027] ERROR in app: Exception on /edit_profile [POST]
Traceback (most recent call last):
  File "/home/miguel/microblog/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    context)
  File "/home/miguel/microblog/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
    cursor.execute(statement, parameters)
sqlite3.IntegrityError: UNIQUE constraint failed: user.username

堆栈跟踪指示了 BUG 在何处。 本应用允许用户更改用户名,但却没有验证所选的新用户名与系统中已有的其他用户有没有冲突。 这个错误来自 SQLAlchemy,它尝试将新的用户名写入数据库,但数据库拒绝了它,因为 username 列是用 unique=True 定义的。

值得注意的是,提供给用户的错误页面并没有提供关于错误的丰富信息,这是正确的做法。 我绝对不希望用户知道崩溃是由数据库错误引起的,或者我正在使用什么数据库,或者是我的数据库中的一些表和字段名称。 所有这些信息都应该对外保密。

但是也有一些不尽人意之处。错误页面简陋不堪,与应用布局不匹配。 终端上的日志不断刷新,导致重要的堆栈跟踪信息被淹没,但我却需要不断回顾它,以免有漏网之鱼。 当然,我有一个 BUG 需要修复。 我将解决所有的这些问题,但首先,让我们来谈谈 Flask 的 调试模式 。

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

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

发布评论

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