gpt4 book ai didi

python - Flask post/redirect/get 模式无法从错误中恢复

转载 作者:行者123 更新时间:2023-11-28 18:58:01 26 4
gpt4 key购买 nike

我在 Flask View 函数中遇到错误恢复问题。它的简化版本在这里:

@app.route('/log', methods=['POST', 'GET'])
def elog():
form = LogForm()
if form.validate_on_submit():
flask.session['logformdata'] = form.data
return flask.redirect(flask.url_for('elog'))

try:
formdata = flask.session.pop('logformdata')
except KeyError:
return flask.render_template('log.html', form=form)

log = ... # result of a query
form.process(data=formdata)
return flask.render_template('log.html', form=form, log=log)

重要的部分是它实现了 post/redirect/get 模式,并将 POST 和 GET 之间的表单数据存储在使用 HTTP cookie 实现的 flask.session 存储中。

现在让我们假设某处存在错误,并且函数因某些输入而崩溃。当然,这不应该发生。但一旦发生,用户体验就会很糟糕。

详细说明:

  • 用户发布表单 (POST)
  • 表单数据存储在flask.session中,即作为cookie
  • 重定向后,再次调用该函数 (GET),但现在它意外崩溃了。用户看到一些错误消息。这不好,但错误会发生。
  • 用户重新加载页面打算重新开始,但一次又一次地重复同样的错误!

关键在于语句flask.session.pop将表单数据从session存储中移除,但是当函数崩溃时,相应的cookie仍然保留在用户的浏览器。每次重新加载都会再次触发错误。重新启动浏览器可能会有所帮助(取决于 session.permanent 标志)。唯一有保证的补救措施是从浏览器中手动删除 cookie。这实际上使网页无法使用。

我想我可以通过设置一个非常短的 cookie 生命周期(15 秒左右)或在每次重启后生成一个新的 key 来缓解这个问题。我没有尝试过,如果session cookie包含其他数据,那肯定不是一个好的解决方案。

我怎样才能让上面的函数更健壮?

最佳答案

如果没有办法处理 View 本身的错误,我的方法是 register an error handler对于整个应用程序,并在此处管理 session ,即重置为默认/安全状态。

例子:

@app.errorhandler(500)
def handle_internal_server_error(ex):
"""Handle an unexpected and uncaught (500) server error."""

# Reset session here & display error (e.g. flash or other)

return # redirect or render

关于python - Flask post/redirect/get 模式无法从错误中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com