Я пытаюсь преодолеть ситуацию, которую получаю 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
Но приведенная выше схема приведет к:
Задница, обсуждаемая в нескольких постах, вероятно, связана с контекстом приложения рабочих. Но я не понимаю этого полностью.
Я также пытался разорвать сеанс БД после каждой задачи, но безуспешно.
Кто-нибудь может указать мне правильное направление?
Заранее спасибо.