【问题标题】:Flask app: Heroku Postgres cannot load remembered user from dbFlask 应用程序:Heroku Postgres 无法从数据库加载记住的用户
【发布时间】:2020-09-14 09:34:03
【问题描述】:

我在 Heroku 上有一个简单的 Flask 应用程序,它带有非常标准的“/login”路由(几乎从著名的 Flask Mega 教程中复制)和带有“记住我”功能的登录表单。

加载应用时偶尔会出现以下服务器错误(错误日志很大,但结尾是):

2020-05-25T18:01:05.614460+00:00 app[web.1]: sqlalchemy.exc.OperationalError: (psycopg2.errors.AdminShutdown) terminating connection due to administrator command
2020-05-25T18:01:05.614460+00:00 app[web.1]: SSL connection has been closed unexpectedly
2020-05-25T18:01:05.614460+00:00 app[web.1]: 
2020-05-25T18:01:05.614462+00:00 app[web.1]: [SQL: SELECT "user".id AS user_id, "user".username AS user_username, "user".email AS user_email, "user".password_hash AS user_password_hash
2020-05-25T18:01:05.614462+00:00 app[web.1]: FROM "user"
2020-05-25T18:01:05.614463+00:00 app[web.1]: WHERE "user".id = %(param_1)s]
2020-05-25T18:01:05.614463+00:00 app[web.1]: [parameters: {'param_1': 1}]
2020-05-25T18:01:05.614621+00:00 app[web.1]: (Background on this error at: http://sqlalche.me/e/e3q8)

我认为问题在于我有一个已“记住”的登录用户。下次加载应用程序时,应用程序会登录“记住”用户,但有时会断开与数据库的连接(因此出现上面的 OperationaError)。只需再次加载页面一次或两次即可解决该错误。

链接http://sqlalche.me/e/e3q8 解释说这是程序员无法控制的事情。我没有防止此类错误的技能,但我至少可以检测到它并重新路由用户以获得更好的用户体验。

我可以在典型的 Flask 代码中的哪里检查这个问题,而不是让用户看到丑陋的标准“内部服务器错误”,而是将用户重新路由到我的自定义错误页面?

用户的正常入口点是“/index”,它不需要登录,但会检查用户是否已登录:

{% if current_user.is_authenticated %} 

这是我的“/login”路由代码的开头:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))

【问题讨论】:

  • 您是否尝试过删除记住我功能以检查它是否可以在没有它的情况下工作?
  • 嗨@Patch,如果帖子不清楚,对不起。该应用程序 95% 的时间都可以在有或没有“记住我”的情况下运行,但有时它会给出上述信息。所以它似乎有时会断开数据库连接。只有在启用“记住我”时才会发生错误。我不想删除该功能。我认为它对用户非常有用。
  • 它不能随机工作,你需要检查它什么时候工作,什么时候不工作。也许在错误出现时尝试调试您的程序。它不能只是随机断开与它不那样工作的数据库的连接。并且错误发生在\login 路由中?
  • 根据 sqlalchemy 文档,这可能会发生 - 这是 sqlalchemy 文档中与此类错误相关的引述:“与数据库操作相关且不一定受控制的错误引发的异常程序员,例如发生意外断开连接..."
  • 问题是你确定是这样吗?因为看起来您正在运行一个简单的程序,并且看起来如果它确实发生了它就像百万分之一,也许您的数据库设置不正确?它从来没有发生在我身上,我可以这么说。为什么你的 current.is_autenticated 是个问题?应该不错

标签: python-3.x flask heroku


【解决方案1】:

我已经找到了解决上述问题的方法。 Flask 有一个内置的错误处理程序装饰器,它会捕获这个错误并呈现一个自定义错误模板:

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

请在 Flask Mega-Tutorial error handling 部分查看详细信息。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2016-07-20
    • 2019-11-17
    • 2012-10-31
    相关资源
    最近更新 更多