Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Heroku上的烧瓶和芹菜:sqlalchemy.exc.DatabaseError:(psycopg2.DatabaseError)SSL错误:解密失败或记录错误_Python_Heroku_Flask_Celery_Flask Sqlalchemy - Fatal编程技术网

Python Heroku上的烧瓶和芹菜:sqlalchemy.exc.DatabaseError:(psycopg2.DatabaseError)SSL错误:解密失败或记录错误

Python Heroku上的烧瓶和芹菜:sqlalchemy.exc.DatabaseError:(psycopg2.DatabaseError)SSL错误:解密失败或记录错误,python,heroku,flask,celery,flask-sqlalchemy,Python,Heroku,Flask,Celery,Flask Sqlalchemy,我正在尝试在heroku上部署一个flask应用程序,它使用芹菜中的后台任务。我已经实现了,这样芹菜进程就不会绑定到flask应用程序的任何一个实例 这在本地工作,我还没有看到错误。但是当部署到heroku时,总是会出现相同的结果:芹菜任务(我只使用一个)在第一次运行时成功,但是对该任务的任何后续芹菜调用都会失败,并出现sqlalchemy.exc.DatabaseError:(psycopg2.DatabaseError)SSL错误:解密失败或坏记录mac。如果我重新启动芹菜工人,循环将继续

我正在尝试在heroku上部署一个flask应用程序,它使用芹菜中的后台任务。我已经实现了,这样芹菜进程就不会绑定到flask应用程序的任何一个实例

这在本地工作,我还没有看到错误。但是当部署到heroku时,总是会出现相同的结果:芹菜任务(我只使用一个)在第一次运行时成功,但是对该任务的任何后续芹菜调用都会失败,并出现
sqlalchemy.exc.DatabaseError:(psycopg2.DatabaseError)SSL错误:解密失败或坏记录mac
。如果我重新启动芹菜工人,循环将继续

有很多方法显示了这一点,但没有一种方法指定了正确的解决方案。我最初认为实现应用程序工厂模式可以防止出现这种错误,但事实并非如此

app/\uuuuu init\uuuuu.py
中,我创建芹菜和db对象:

celery = Celery(__name__, broker=Config.CELERY_BROKER_URL)
db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    return app
My
flask\u芹菜.py
文件创建实际的flask应用程序对象:

import os
from app import celery, create_app

app = create_app(os.getenv('FLASK_CONFIG', 'default'))
app.app_context().push()
我用这个命令启动芹菜:
芹菜工人-A app.flask\u芹菜.芹菜--loglevel=info

这就是实际芹菜任务的样子:

@celery.task()
def task_process_stuff(stuff_id):
    stuff = Stuff.query.get(stuff_id)
    stuff.processed = True
    db.session.add(stuff)
    db.session.commit()
    return stuff
由以下程序调用:

task_process_stuff.apply_async(args=[stuff.id], countdown=10)
库版本

  • 烧瓶0.12.2
  • SQLAlchemy 1.1.11
  • 炼金术2.2
  • 芹菜4.0.2

解决方案是在任务开始时添加
db.engine.dispose()
,在任何工作开始之前处理所有db连接:

@celery.task()
def task_process_stuff(stuff_id):
    db.engine.dispose()
    stuff = Stuff.query.get(stuff_id)
    stuff.processed = True
    db.session.commit()
    return stuff
由于我在所有任务中都需要此功能,因此我将其添加到了
task\u prerun

@task_prerun.connect
def on_task_init(*args, **kwargs):
    db.engine.dispose()

只是为了确保你不能对数据库进行任何正确的查询?@skagra_dragneel第一次,我可以连接到数据库,任务工作正常。在那之后的任何时候,任务都会立即失败,无法对数据库进行查询。darn认为我有解决方案,也有类似的问题,但我根本无法连接到数据库。你的芹菜工人一直在重复使用相同的连接。提交会话后,如何使用
db.session.remove()
?它应该强制重新建立连接。@OluwafemiSule我尝试在提交后添加
db.session.remove()
,但错误仍然存在。有人能解释这个问题的根本原因吗?为什么这会影响芹菜工人而不是Gunicorn工人?嗨,我也有同样的问题,我不知道为什么会这样?芹菜工人的行为很奇怪。。。