2013-08-28 4 views
3

я знаю, что есть несколько вопроса о том, как иметь дело с колбой «работать вне контекста приложения», но я не мог заставить их работать для меняколба 0,10 Монго работающих вне контекста приложения

У меня есть длинный ход mongo и планируются к запуску через регулярные интервалы с помощью apscheduler. Ниже представлена ​​моя структура приложения, но задачи не выполняются с помощью «RuntimeError: работа вне контекста приложения». ihttp: //flask.pocoo.org/docs/patterns/sqlite3/ имеет пример использования новой флэшки. Но интересно, может ли кто-нибудь сообщить о том, как правильно сохранить соединение mongodb по всему миру и поделиться этим соединением в apscheduler.

__init.py__ 

from app import create_app 

app.py

from flask import Flask, request, render_template,g 
from .extention import mongo, redis, sched 

def create_app(config=None): 
"""Create a Flask app.""" 

    app = Flask(__name__) 
    configure_extensions(app) 
    return app 

def configure_extensions(app): 
    mongo.init_app(app) # initialise mongo connection from the config 
    redis.init_app(app) 

from schedule_tasks import * 

extention.py

from flask.ext.pymongo import PyMongo 
mongo = PyMongo() 

from apscheduler.scheduler import Scheduler 
config = {'apscheduler.jobstores.file.class': 'apscheduler.jobstores.shelve_store:ShelveJobStore', 
      'apscheduler.jobstores.file.path': '/tmp/sched_dbfile'} 
sched = Scheduler(config) 

from flask.ext.redis import Redis 
redis = Redis() 

schedule_tasks.py

from .extention import mongo 
@sched.interval_schedule(minutes=1) 
def long_running_queries(): 
    ## mongo agg query ## 
    mongo.db.command("aggregate", "collection", pipeline = "some query") 
sched.start() 
sched.print_jobs() 
+0

Какая линия бросает RuntimeError? Можете ли вы поместить полную трассировку стека? –

+0

error i get is "raise RuntimeError (« работает вне контекста приложения »)« Файл «schedule_tasks.py», строка 5, в монго – Linus

ответ

5

Чтобы понять эту ошибку, вам необходимо знать application context.

Вполне возможно, что кто-то может написать несколько приложений для фляг, которые обрабатывают их запросы в том же процессе. Документы give the following example...

from werkzeug.wsgi import DispatcherMiddleware 
from frontend_app import application as frontend 
from backend_app import application as backend 

application = DispatcherMiddleware(frontend, { 
    '/backend':  backend 
}) 

Имейте в виде, что в этом случае приложение может использовать интерфейс различных установки Монго, но использовать один и тот же объект Монго расширения. По этой причине Flask не может предположить, что является «текущим» приложением при запуске скрипта. Поэтому такие вещи, как url_for(), или многие из методов на расширениях, таких как расширение MongoDB, должны знать, какое приложение является «текущим», прежде чем они что-либо сделают.

Таким образом, всякий раз, когда вы пытаетесь использовать функции Flask или extension, чтобы делать что-либо, кроме как настроить сами приложения (с настройками и т. Д.), Вам нужно явно указать Flask, что текущее приложение назначает application context.

Документов дают так, что вы можете сделать это ..

# Be careful about recursive imports here 
from . import app 
from .extention import mongo 

@sched.interval_schedule(minutes=1) 
def long_running_queries(): 
    with app.app_context(): 
     mongo.db.command("aggregate", "collection", pipeline = "some query") 

Итак, вам нужно создать сам объект приложения, а затем использовать with app.app_context() линии. В этом случае со всеми вашими вызовами (например, с вашим монгольским расширением). Обратите внимание, что вам не нужно делать что-либо из этого в представлении, потому что Flask автоматически выполнит все это как часть обработки запроса.

Смежные вопросы