У меня есть простое приложение Flask на Heroku с маршрутом '/ login', которое является очень стандартным (в значительной степени скопировано из известного Flask Mega Tutorial) и формой входа с функцией «запомнить меня».
Иногда я получаю следующую ошибку сервера при загрузке приложения (журнал ошибок большой, но конец есть):
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'))