Python 烧瓶-未绑定到当前上下文
我正试图编写一个类,ChangeBackStatusOnErrorTask,它完全按照它的名字来做Python 烧瓶-未绑定到当前上下文,python,flask,celery,Python,Flask,Celery,我正试图编写一个类,ChangeBackStatusOnErrorTask,它完全按照它的名字来做 class ChangeBackStatusOnErrorTask(Task): abstract = True def on_failure(self, exc, task_id, args, kwargs, einfo): server = Server.query.get(server_id) server.status = RemoteStatus.ERROR
class ChangeBackStatusOnErrorTask(Task):
abstract = True
def on_failure(self, exc, task_id, args, kwargs, einfo):
server = Server.query.get(server_id)
server.status = RemoteStatus.ERROR
db.session.commit()
@celery.task(bind=True, base=ChangeBackStatusOnErrorTask)
def deploy_server(self, server_id):
try:
server.status = RemoteStatus.LAUNCHING
db.session.commit()
host = server.ssh_user + '@' + server.ip
execute(fabric_deploy_server, self, server, hosts=host)
server.status = RemoteStatus.LAUNCHED
db.session.commit()
except Exception as e:
server.status = RemoteStatus.ERROR
db.session.commit()
traceback.print_exc()
raise e
但是,由于ChangeBackStationErrorTask未绑定到my Flask上下文,因此此代码不起作用:
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/celery/app/trace.py", line 367, in trace_task
R = retval = fun(*args, **kwargs)
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/celery/app/trace.py", line 622, in __protected_call__
return self.run(*args, **kwargs)
File "/Users/vng/Dropbox/Code/Affiliate/AutomataHeroku/automata/server/tasks.py", line 59, in deploy_server
server = Server.query.get(server_id)
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 498, in __get__
return type.query_class(mapper, session=self.sa.session())
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 78, in __call__
return self.registry()
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 990, in __call__
return self.registry.setdefault(key, self.createfunc())
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2861, in __call__
return self.class_(**local_kw)
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 143, in __init__
self.app = app = db.get_app()
File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 957, in get_app
'application not registered on db instance and no application'
RuntimeError: application not registered on db instance and no application bound to current context
如何解决这个问题?我假设您使用sqlachemy和flask sqlalchemy扩展。您从某个专用模块获得
db
对象,该对象也绑定到flask实例(请编辑您的问题以澄清这些问题)
在应用程序中
模块声明芹菜配置:
app = Flask(__name__)
app.config[CELERY_BROKER_URL] = 'redis://localhost:6379'
app.config[CELERY_RESULT_BACKEND] = 'redis://localhost:6379'
然后在芹菜模块内,您需要将其绑定到烧瓶上:
from celery import Celery
from app import current_app as app
def bound_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
celery = bound_celery(app)
最后,使用芹菜
创建的对象装饰您的任务:
@celery.task(bind=True, base=ChangeBackStatusOnErrorTask)
def deploy_server(self, server_id):
...
来源:您是否尝试创建应用程序
app=Flask(uuu name_uuu)
intasks.py
在你的课程定义之前,我目前正在使用Flask芹菜,它的功能与你提到的几乎相同:因此我认为Flask芹菜在这方面已经涵盖了我。正如和所说的,不再需要扩展。使用它将面临依赖不再维护中间件的风险。无论如何,回头看我的答案,它似乎是错的,错误绑定的对象是db
而不是芹菜
。你能分享你的全部代码吗?这样我们就可以看到你的db对象是如何创建和共享的。@lee pai long你刚刚创造了我的一天!我真希望早点找到这个医生!