Flask app:Heroku Postgres无法从数据库加载记住的用户



我在 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)

我相信问题是我有一个"记住"的登录用户。下次加载应用程序时,应用程序会登录"记住"用户,但有时会断开与数据库的连接(因此上面的操作错误(。只需再次加载页面一次或两次即可解决该错误。

链接 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'))

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

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

有关详细信息,请参阅烧瓶超级教程的错误处理部分。

最新更新