我在 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
有关详细信息,请参阅烧瓶超级教程的错误处理部分。