Flask приложение: Heroku Postgres не может загрузить запомненного пользователя из базы данных - PullRequest
1 голос
/ 27 мая 2020

У меня есть простое приложение 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'))

1 Ответ

0 голосов
/ 03 июня 2020

Я нашел решение проблемы выше. Flask имеет встроенный декоратор обработчика ошибок, который поймает эту ошибку и отобразит настраиваемый шаблон ошибки:

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

Подробности см. В разделе Flask Mega-Tutorial, обработка ошибок .

...