2016-10-18 13 views
11

Chcę uruchomić zadanie z Flask-APScheduler, które wysyła zapytanie do modelu Flask-SQLAlchemy. Po uruchomieniu zadania otrzymuję RuntimeError: application not registered on db instance and no application bound to current context. Jak uruchomić zadanie, które wysyła zapytanie do bazy danych.Model zapytania w zadaniu Flask-APScheduler podnosi kontekst aplikacji RuntimeError

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) 

Błąd występuje podczas kwerendy, zanim będzie można go wydrukować. Baza danych działa w pozostałej części aplikacji dla innych zapytań.

Próbowałem dodać podczas konfigurowania rozszerzenia, ale to nie zadziałało.

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

Pełne traceback jest:

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 

Odpowiedz

2

Kolba-SQLAlchemy wymaga aktywnego kontekstu aplikacji do wykonywania zapytań. Podczas gdy Flask-APScheduler integruje APScheduler z Flask, nie przesuwa kontekstu aplikacji podczas uruchamiania każdego zadania.

Musisz podać kontekst aplikacji w swojej pracy. Przesuwanie kontekstu aplikacji podczas konfigurowania rozszerzenia nic nie daje.

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

Prawdopodobnie potrzebujesz kontekstu aplikacji dla wszystkich zadań. Możesz podklasować rozszerzenie i zastąpić 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 
0

Naprawiłem to poprzez dodanie aplikacji do mojego instancji SQLAlchemy fabrycznie aplikacji:

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 

Próbowałem przy użyciu kontekstu aplikacji, ale to nigdy nie działało.

+0

"To nigdy nie zadziałało" Nie mogę odtworzyć tego problemu. Przesuwanie kontekstu aplikacji jest równoznaczne z uruchomieniem aplikacji. – davidism

+0

Próbowałem przesuwanie kontekstu aplikacji prawie wszędzie w moim kodzie i nada. – ruipacheco

+0

To brzmi jak kolejny numer. – davidism

Powiązane problemy