2016-10-18 6 views
11

मैं फ्लास्क-एपीएसड्यूलर के साथ नौकरी चलाने के लिए चाहता हूं जो फ्लास्क-स्क्लाक्लेमी मॉडल से पूछताछ करता है। जब नौकरी चलती है, तो मुझे RuntimeError: application not registered on db instance and no application bound to current context मिलता है। मैं डेटाबेस से पूछताछ करने वाली नौकरी कैसे चला सकता हूं।फ्लास्क-एपीएसड्यूलर जॉब में क्वेरीिंग मॉडल ऐप संदर्भ बढ़ाता है 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) 

त्रुटि, क्वेरी के दौरान होता है इससे पहले कि यह मुद्रित किया जा सकता। डेटाबेस अन्य प्रश्नों के लिए शेष आवेदन में काम कर रहा है।

मैंने एक्सटेंशन सेट अप करते समय with app.app_context(): जोड़ने का प्रयास किया लेकिन यह काम नहीं किया।

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

पूर्ण ट्रैस है:

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 

उत्तर

2

कुप्पी के SQLAlchemy प्रश्नों पर अमल करने के लिए एक सक्रिय एप्लिकेशन संदर्भ की आवश्यकता है। जबकि फ्लास्क-एपीएसड्यूलर फ्लास्क के साथ एपीएसड्यूलर को एकीकृत करता है, यह प्रत्येक नौकरी चलाने के दौरान अनुप्रयोग संदर्भ को धक्का नहीं देता है।

आपको अपने काम में एक ऐप संदर्भ धक्का देना होगा। एक्सटेंशन सेट अप करते समय ऐप संदर्भ को दबाकर कुछ भी नहीं होता है।

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

आप शायद सभी नौकरियों के लिए एक ऐप संदर्भ चाहते हैं। आप विस्तार को उपclass कर सकते हैं और 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

मैं एप्लिकेशन कारखाने में SQLAlchemy के मेरे उदाहरण के लिए एप्लिकेशन जोड़कर इस तय:

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 

मैं एप्लिकेशन संदर्भ का उपयोग कर प्रयास किया था, लेकिन वह काम नहीं।

+0

"यह कभी काम नहीं किया" मैं उस मुद्दे को पुन: उत्पन्न नहीं कर सकता। ऐप संदर्भ को धक्का देना ऐप के साथ प्रारंभ करने के बराबर है। – davidism

+0

मैंने अपने कोड और नाडा में बस हर जगह ऐप संदर्भ को धक्का देने की कोशिश की। – ruipacheco

+0

यह एक और मुद्दा की तरह लगता है। – davidism

संबंधित मुद्दे