Выполнение команды
Код: Выделить всё
celery -A make_celery worker --loglevel INFO
Код: Выделить всё
RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.
Мой файл make_celery выглядит так:
Код: Выделить всё
import os
from app import create_app
flask_app = create_app(os.getenv('FLASK_CONFIG') or 'default')
celery_app = flask_app.extensions["celery"]
Код: Выделить всё
from celery_app import celery_init_app
from config import config
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
# worker fails here every time as SQLAlCHEMY_DATABASE_URI is not set
db.init_app(app)
with app.app_context():
#not included is importing of models and migrate init
app.config.from_mapping(
CELERY=dict(
broker_url="amqp://guest:guest@127.0.0.1:5672//",
result_backend=app.config['CELERY_BACKEND_URL'],
task_ignore_result=True,
),
)
app.config.from_prefixed_env()
celery_init_app(app)
return app
Код: Выделить всё
def celery_init_app(app: Flask) -> Celery:
class FlaskTask(Task):
def __call__(self, *args: object, **kwargs: object) -> object:
with app.app_context():
return self.run(*args, **kwargs)
celery_app = Celery(app.name, task_cls=FlaskTask)
celery_app.config_from_object(app.config["CELERY"])
celery_app.set_default()
app.extensions["celery"] = celery_app
return celery_app
Я запустил приведенную выше рабочую команду celery, ожидая, что она создайте работника, который будет иметь доступ к экземпляру приложения flask и всем его компонентам, но вместо этого ему не удалось инициировать объект базы данных sqlalchemy из-за отсутствия переменных среды.
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-as-flask