For at forstå denne fejl skal du forstå applikationskonteksten .
Det er fuldt ud muligt for nogen at skrive flere Flask-applikationer, der alle håndterer deres anmodninger i den samme proces. Dokumenterne giver følgende eksempel...
from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend
application = DispatcherMiddleware(frontend, {
'/backend': backend
})
Husk på, at frontend-appen i dette tilfælde kunne bruge forskellige Mongo-opsætninger, men bruge nøjagtig det samme Mongo-udvidelsesobjekt. Af denne grund kan Flask ikke antage, hvilken der er den "aktuelle" app, når du kører et script. Derfor ting såsom url_for()
, eller mange af metoderne på udvidelser som MongoDB-udvidelsen, skal vide, hvilken applikation der er den "aktuelle", før de gør noget.
Derfor, når du forsøger at bruge Flask eller udvidelsesfunktioner til at gøre andet end at opsætte selve applikationerne (med konfigurationsværdier osv.), skal du udtrykkeligt fortælle Flask, hvad den aktuelle app er, der skal tildeles til applikationskontekst .
Dokumenterne giver en måde, hvorpå du kan gøre dette..
# 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" )
Så du skal oprette selve appobjektet og derefter bruge with app.app_context()
linje. Inden for denne med-erklæring burde alle dine opkald (såsom dem til din Mongo-lokalnummer) fungere. Bemærk, at du ikke behøver at gøre noget af dette i en visning, fordi Flask automatisk vil gøre alt dette som en del af sin håndtering af en anmodning.