Ton*_*one 11 python flask flask-sqlalchemy apscheduler
我想用Flask-APScheduler运行一个查询Flask-SQLAlchemy模型的工作.当工作开始时,我明白了RuntimeError: application not registered on db instance and no application bound to current context.如何运行查询数据库的作业.
from flask_apscheduler import APScheduler
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()
Run Code Online (Sandbox Code Playgroud)
from models import User
def my_job():
user = User.query.first()
print(user)
Run Code Online (Sandbox Code Playgroud)
查询期间发生错误,然后才能打印.数据库正在其他应用程序中工作以进行其他查询.
我试图with app.app_context():在设置扩展时添加,但这不起作用.
with app.app_context()
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()
Run Code Online (Sandbox Code Playgroud)
完整的追溯是:
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
Run Code Online (Sandbox Code Playgroud)
Flask-SQLAlchemy需要活动的应用程序上下文来执行查询。尽管Flask-APScheduler确实将APScheduler与Flask集成在一起,但在运行每个作业时它不会推送应用程序上下文。
您需要在工作中推送应用上下文。设置扩展程序时推送应用程序上下文没有任何作用。
def my_job():
with app.app_context():
...
Run Code Online (Sandbox Code Playgroud)
您可能需要所有作业的应用程序上下文。您可以扩展子类并覆盖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
Run Code Online (Sandbox Code Playgroud)
我通过在应用程序工厂中强制 Flask-SQLAlchemy 扩展处于单应用程序模式来修复此问题。这在技术上是不正确的,可能会在其他地方引起问题,但它解决了我的具体问题。
def create_app():
new_app = Flask(__name__)
db.init_app(new_app)
db.app = new_app
return new_app
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |