El modelo de consulta en el trabajo Flask-APScheduler genera el contexto de la aplicación RuntimeError

Quiero ejecutar un trabajo con Flask-APScheduler que consulta un modelo de Flask-SQLAlchemy. Cuando se ejecuta el trabajo, obtengo RuntimeError: application not registered on db instance and no application bound to current context . ¿Cómo puedo ejecutar un trabajo que consulta la base de datos?

 from flask_apscheduler import APScheduler scheduler = APScheduler() scheduler.init_app(app) scheduler.start() 
 from models import User def my_job(): user = User.query.first() print(user) 

El error se produce durante la consulta, antes de que se pueda imprimir. La base de datos está trabajando en el rest de la aplicación para otras consultas.

Intenté agregar with app.app_context(): al configurar la extensión, pero no funcionó.

 with app.app_context() scheduler = APScheduler() scheduler.init_app(app) scheduler.start() 

El rastreo completo es:

 ERROR:apscheduler.executors.default:Job "run_in (trigger: interval[0:00:10], next run at: 2016-10-18 23:00:53 CEST)" raised an exception Traceback (most recent call last): File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/apscheduler/executors/base.py", line 125, in run_job retval = job.func(*job.args, **job.kwargs) File "/Users/user/Documents/myfolder/myfolder/myfile.py", line 19, in myjob user = User.query.all() File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 454, in __get__ return type.query_class(mapper, session=self.sa.session()) File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 71, in __call__ return self.registry() File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 878, in __call__ return self.registry.setdefault(key, self.createfunc()) File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 704, in create_session return SignallingSession(self, **options) File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 149, in __init__ self.app = db.get_app() File "/Users/user/.virtualenvs/myfolder/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 845, in get_app raise RuntimeError('application not registered on db ' RuntimeError: application not registered on db instance and no application bound to current context 

Arreglé esto agregando la aplicación a mi instancia de SQLAlchemy en la fábrica de aplicaciones:

 def create_app(): new_app = Flask(__name__) new_app.config.from_object('config') new_app.secret_key = os.urandom(12) db.init_app(new_app) db.app = new_app return new_app 

Intenté usar el contexto de la aplicación pero eso nunca funcionó.

Flask-SQLAlchemy requiere un contexto de aplicación activo para ejecutar consultas. Mientras que Flask-APScheduler integra APScheduler con Flask, no empuja el contexto de una aplicación cuando ejecuta cada trabajo.

Tendrá que empujar un contexto de aplicación en su trabajo. Presionar el contexto de una aplicación al configurar la extensión no hace nada.

 def my_job(): with app.app_context(): ... 

Probablemente quieras un contexto de aplicación para todos los trabajos. Puede subclasificar la extensión y anular run_job .

 from flask_apscheduler import APScheduler as _BaseAPScheduler class APScheduler(_BaseAPScheduler): def run_job(self, id, jobstore=None): with self.app.app_context(): super().run_job(id=id, jobstore=jobstore) # super(APScheduler, self) in Python 2