Рабочий шаблон для колбы, сельдерея и SQL-алхимии - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь преодолеть ситуацию, которую получаю SSL error: decryption failed or bad record mac с помощью операций БД SQL-Alchemy в задаче сельдерея. Первая операция БД выполняется правильно, вторая и любые последующие вызовут вышеупомянутую ошибку.

В настоящее время я использую этот шаблон:

* 1007 INIT * .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

Задница, обсуждаемая в нескольких постах, вероятно, связана с контекстом приложения рабочих. Но я не понимаю этого полностью.

Я также пытался разорвать сеанс БД после каждой задачи, но безуспешно.

Кто-нибудь может указать мне правильное направление?

Заранее спасибо.

...