我正在努力克服在芹菜任务中使用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
在几篇文章中讨论过,这个问题可能与工作人员的应用环境有关。但是我不完全理解。
我还尝试在每个任务结束后拆除数据库会话,但是没有运气。
有人能指出我正确的方向吗?
谢谢。