Aby zrozumieć ten błąd, musisz zrozumieć kontekst aplikacji .
Jest całkowicie możliwe, że ktoś napisze wiele aplikacji Flask, które obsługują ich żądania w tym samym procesie. Dokumenty podają następujący przykład...
from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend
application = DispatcherMiddleware(frontend, {
'/backend': backend
})
Pamiętaj, że w tym przypadku aplikacja frontendowa może używać różnych konfiguracji Mongo, ale używać dokładnie tego samego obiektu rozszerzenia Mongo. Z tego powodu Flask nie może zakładać, która aplikacja jest „bieżącą” aplikacją podczas uruchamiania skryptu. Dlatego takie rzeczy jak url_for()
lub wiele metod na rozszerzeniach, takich jak rozszerzenie MongoDB, musi wiedzieć, która aplikacja jest „bieżąca”, zanim cokolwiek zrobią.
Dlatego za każdym razem, gdy próbujesz użyć Flask lub funkcji rozszerzeń do zrobienia czegokolwiek innego niż skonfigurowanie samych aplikacji (z wartościami konfiguracyjnymi itp.), musisz jawnie powiedzieć Flask, jaka jest bieżąca aplikacja do przypisania do kontekst aplikacji .
Dokumenty opisują sposób, w jaki możesz to zrobić.
# 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" )
Musisz więc utworzyć sam obiekt aplikacji, a następnie użyć with app.app_context()
linia. W tym zestawieniu wszystkie połączenia (takie jak te z numerem wewnętrznym Mongo) powinny działać. Pamiętaj, że nie musisz tego robić w widoku, ponieważ Flask automatycznie zrobi to wszystko w ramach obsługi żądania.