我正在使用Flask-Login进行用户身份验证的Docker群中运行Flask Web应用程序。我对User类进行了建模,并使用Flask-SQLAlchemy将应用程序连接到位于AWS RDS数据库实例上的Postgres数据库。
Flask-Login希望在模型类中放置一个函数,以给定用户ID的方式查找用户,定义如下:
@login.user_loader
def load_user(id):
return User.query.get(int(id))
Flask-Login然后使用此功能来调用您的用户模型以获取有关会话中存储的当前用户的信息。
这在大多数情况下都可以正常工作,但是我时不时地遇到一个问题,即此调用与Postgres连接断开有关。当我连接到AWS Postgres实例或Postgres的本地运行Docker实例时,都会发生这种情况。
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)
[我碰到this帖子,该帖子谈到了在SQLAlchemy中使用pool_pre_ping
参数,这基本上使sqlalchemy始终在进行操作之前首先测试连接(了解更多here)。因此,我更改了flask-sqlalchemy的入口,以反映这一点。
db = SQLAlchemy(engine_options={'pool_pre_ping': True})
尽管仍然不那么频繁,我仍然遇到问题。有人有什么主意吗?我知道这很可能与SQLAlchemy池连接的方式有关-但我不确定是什么。
不确定这是否有帮助,但是我的SQLAlchemy连接字符串中确实包含以下内容(请注意pool_recycle)...
# pool_recycle manages situation where mysql automatically disconnects after 8 hours of inactivity
qry_engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/', pool_recycle=3600, echo=False)
我几乎是一个业余爱好者,有SQLAlchemy,但是我前一段时间从文档中得到了这个,当然也把它放进去了。我还注意到它可能是特定于mySQL的。我并没有深入研究3600分钟后发生的情况。