【问题标题】:uWSGI (PythonAnywhere), Flask, SQLAlchemy, and PostgreSQL: SSL error: decryption failed or bad record macuWSGI (PythonAnywhere)、Flask、SQLAlchemy 和 PostgreSQL:SSL 错误:解密失败或坏记录 mac
【发布时间】:2021-03-30 19:22:21
【问题描述】:

我有一个在 PythonAnywhere 上运行的 Flask 应用程序和一个来自 DigitalOcean 的 PostgreSQL 托管数据库。我正在使用 Flask-SQLAlchemy 连接到数据库。

连接到远程数据库时,我的应用程序在本地运行良好。但是,当我在 PythonAnywhere 上运行该应用程序时,它会失败。我怀疑是 uWSGI 的多个工作人员导致了问题,正如 Stack Overflow 帖子所述:uWSGI, Flask, sqlalchemy, and postgres: SSL error: decryption failed or bad record mac

这是我收到的错误消息

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL error: decryption failed or bad record mac

错误是由一个简单的 Flask-SQLAlchemy 方法触发的:

user = User.query.get(id)

另一个 Stack Overflow 帖子提供了一个解决方案,我可以在其中更改 uWSGI 的配置。但是在 PythonAnywhere 中,我无法修改 uWSGI 的配置。此外,在初始化应用程序后处理数据库引擎并不能解决问题。是否有替代解决方案?

编辑 1:我有一个付费帐户。

【问题讨论】:

  • 您有免费帐户吗?如果是这样,您将无法连接 PythonAnywhere 上的外部 postgres 服务器。
  • @caseneuve 我有一个付费帐户。

标签: postgresql flask flask-sqlalchemy uwsgi pythonanywhere


【解决方案1】:

在初始化应用 DID 后释放数据库引擎可以解决问题。这是帮助我的帖子的链接:https://github.com/pallets/flask-sqlalchemy/issues/745#issuecomment-499970525

这就是我在代码中修复它的方式。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from tms_sola.config import Config  # my custom config object

db = SQLAlchemy()

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)
    app.app_context().push()

    with app.app_context(): 
        db.init_app(app)

        # https://github.com/pallets/flask-sqlalchemy/issues/745#issuecomment-499970525
        db.session.remove()
        db.engine.dispose()

    from tms_sola.blueprints.some_blueprint.routes import some_blueprint

    # https://github.com/pallets/flask-sqlalchemy/issues/745#issuecomment-499970525
    db.session.remove()
    db.engine.dispose()

    return app

【讨论】:

  • PythonAnywhere 在这里开发——这是有道理的。发生的情况是,当您的站点最初启动时,它正在创建与 Postgres 实例的连接。它完成了您的初始化工作,然后继续进行完整的网站初始化并移交给 PythonAnywhere,然后 PythonAnywhere 将您的单个启动过程克隆为多个启动过程。不幸的是,他们都有之前创建的相同连接的副本,所以当他们尝试使用它时,他们互相绊倒了。您对数据库引擎的处置清除了连接池,因此它们都从新的空连接池开始。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2013-07-05
  • 2015-06-13
  • 1970-01-01
相关资源
最近更新 更多