烧瓶,芹菜和SQL炼金术的工作模式

时间:2019-01-06 14:27:00

标签: python flask celery flask-sqlalchemy

我正在努力克服在芹菜任务中使用SQL-Alchemy DB操作收到SSL error: decryption failed or bad record mac的情况。第一个数据库操作正确执行,第二个及随后的任何操作都会引发上述错误。

当前我使用此模式:

初始化 .py

from project.appfactory import create_app
app = create_app()
app.app_context().push()

from project.models import ClientConfiguration
clients = ClientConfiguration.query.filter().all()
(... some further processing at startup ..)

appfactory.py

from flask import Flask
from project.extensions import celery, db

def create_app():
    app = Flask(__name__)
    app.config.from_object('project.config.LocalConfig')

    # bind SQLAlchemy object to app
    db.init_app(app)

    #init celery
    celery.init_app(app)

    return app

extensions.py

from flask_sqlalchemy import SQLAlchemy
from celery import Celery

class FlaskCelery(Celery):

    def __init__(self, *args, **kwargs):

        super(FlaskCelery, self).__init__(*args, **kwargs)
        self.patch_task()

        if 'app' in kwargs:
            self.init_app(kwargs['app'])

    def patch_task(self):
        TaskBase = self.Task
        _celery = self

        class ContextTask(TaskBase):
            abstract = True

            def __call__(self, *args, **kwargs):
                if flask.has_app_context():
                    return TaskBase.__call__(self, *args, **kwargs)
                else:
                    with _celery.app.app_context():
                        return TaskBase.__call__(self, *args, **kwargs)

        self.Task = ContextTask

    def init_app(self, app):
        self.app = app
        self.config_from_object(app.config)


celery = FlaskCelery(broker='redis://localhost:6379/0')
celery.autodiscover_tasks(packages=['project'])
db = SQLAlchemy()

tasks.py

from project.extensions import db, celery
from project.models import *
from flask import current_app as app

@celery.task
def my_background_task():
    # some long running task here
    foo = Foo.query.all()
    bar = Bar.query.all()

我使用pipenv run celery worker -A project.extensions --loglevel=INFO

开始芹菜

此设置遵循此处发布的建议:Stackoverflow Post 但是上述模式将导致:

  • 可以进行第一个数据库查询

  • 秒,随后的任何查询将生成SSL error: decryption failed or bad record mac

在几篇文章中讨论过,这个问题可能与工作人员的应用环境有关。但是我不完全理解。

我还尝试在每个任务结束后拆除数据库会话,但是没有运气。

有人能指出我正确的方向吗?

谢谢。

0 个答案:

没有答案