MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Flask 0.10 Mongo funktioniert außerhalb des Anwendungskontexts

Um diesen Fehler zu verstehen, müssen Sie den Anwendungskontext verstehen .

Es ist durchaus möglich, dass jemand mehrere Flask-Anwendungen schreibt, die alle ihre Anforderungen im selben Prozess verarbeiten. Die Dokumentation gibt das folgende Beispiel...

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

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

Denken Sie daran, dass die Frontend-App in diesem Fall unterschiedliche Mongo-Setups verwenden könnte, aber genau dasselbe Mongo-Erweiterungsobjekt verwenden könnte. Aus diesem Grund kann Flask nicht davon ausgehen, welches die „aktuelle“ App ist, wenn Sie ein Skript ausführen. Daher Dinge wie url_for() , oder viele der Methoden von Erweiterungen wie der MongoDB-Erweiterung, müssen wissen, welche Anwendung die "aktuelle" ist, bevor sie irgendetwas tun.

Wenn Sie daher versuchen, Flask- oder Erweiterungsfunktionen zu verwenden, um etwas anderes zu tun, als die Anwendungen selbst einzurichten (mit Konfigurationswerten usw.), müssen Sie Flask explizit mitteilen, was die aktuelle App ist, die der Anwendungskontext .

Die Dokumentation gibt einen Weg, wie Sie dies tun können..

# 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" )

Sie müssen also das App-Objekt selbst erstellen und dann with app.app_context() verwenden Linie. Innerhalb dieser with-Anweisung sollten alle Ihre Anrufe (z. B. die an Ihre Mongo-Nebenstelle) funktionieren. Beachten Sie, dass Sie dies in einer Ansicht nicht tun müssen, da Flask all dies automatisch als Teil der Bearbeitung einer Anfrage erledigt.