【发布时间】:2018-12-03 00:41:05
【问题描述】:
我正在尝试按照Celery Based Background Tasks 为一个简单的应用程序创建一个 celery 设置。
在我的 task.py
from celery import Celery
def make_celery(app):
celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
此方法适用于主flask应用程序的app.py。
from flask import Flask
flask_app = Flask(__name__)
flask_app.config.update(
CELERY_BROKER_URL='redis://localhost:6379',
CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(flask_app)
@celery.task()
def add_together(a, b):
return a + b
我的用例是我想在其中创建另一个模块
helpers.py可以定义异步类的集合。分开 基于 celery 的方法并使其模块化。
我所做的是将task.py 模块调用到其他模块helpers.py 以创建一个类AsyncMail 来处理电子邮件操作后台工作。
from task import make_celery
class AsyncMail(object):
def __init__(self, app):
"""
:param app: An instance of a flask application.
"""
self.celery = make_celery(app)
def send(self, msg):
print(msg)
现在我如何访问self.celery 属性来作为类的任何方法的装饰器?
@celery.task()
def send(self, msg):
print(msg)
如果不可能,还有什么其他替代步骤可以解决这个问题?
【问题讨论】:
标签: python flask task celery python-decorators