Я запускаю Flask веб-приложение в Docker рое, которое использует Flask -Login для аутентификации пользователя. У меня смоделирован класс User, и я использую Flask -SQLAlchemy, чтобы подключить приложение к базе данных Postgres, расположенной в экземпляре AWS RDS db.
Flask -Login ожидает размещения функции в вашем классе модели для поиска пользователя по его идентификатору, определенному следующим образом:
@login.user_loader
def load_user(id):
return User.query.get(int(id))
Flask -Login затем использует эту функцию для вызова вашей модели пользователя, чтобы получить информацию о текущем пользователе, хранящемся в сеанс.
В большинстве случаев все работает нормально, но время от времени я сталкиваюсь с проблемой, когда этот вызов приводит к разрыву соединения Postgres. Это происходит как при подключении к экземпляру AWS postgres, так и при локальном запуске Docker экземпляра Postgres.
AWS ошибка тайм-аута:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected
[SQL: SELECT users.id AS users_id, users.name AS users_name, ***TRIMMED***
FROM users
WHERE users.id = %(param_1)s]
[parameters: {'param_1': 14}]
(Background on this error at: http://sqlalche.me/e/e3q8)
Docker (Локальная БД) Тайм-аут:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
[SQL: SELECT users.id AS users_id, users.name AS users_name, ***TRIMMED***
FROM users
WHERE users.id = %(param_1)s]
[parameters: {'param_1': 14}]
(Background on this error at: http://sqlalche.me/e/e3q8)
Я натолкнулся на этот пост , в котором говорилось об использовании параметра pool_pre_ping
в SQLAlchemy, который в основном делает sqlalchemy всегда проверять соединение, прежде чем продолжить (подробнее здесь ). Поэтому я обновил свой экземпляр flask -sqlalchemy, чтобы отразить это.
db = SQLAlchemy(engine_options={'pool_pre_ping': True})
Я все еще сталкиваюсь с проблемой, хотя ... хотя и не так часто. У кого-нибудь есть идеи? Я знаю, что, скорее всего, это как-то связано с тем, как SQLAlchemy объединяет соединения, но я просто не знаю, что именно.