Abyste této chybě porozuměli, musíte porozumět kontextu aplikace .
Je zcela možné, aby někdo napsal více aplikací Flask, které všechny zpracovávají jejich požadavky ve stejném procesu. Dokumenty uvádějí následující příklad...
from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend
application = DispatcherMiddleware(frontend, {
'/backend': backend
})
Mějte na paměti, že v tomto případě může frontendová aplikace používat různá nastavení Mongo, ale používat úplně stejný objekt rozšíření Mongo. Z tohoto důvodu nemůže Flask při spuštění skriptu předpokládat, která je „aktuální“ aplikace. Proto věci jako url_for()
, nebo mnoho metod na rozšířeních, jako je rozšíření MongoDB, potřebuje vědět, která aplikace je „aktuální“, než něco udělá.
Kdykoli se tedy pokoušíte použít Flask nebo rozšiřující funkce k něčemu jinému než k nastavení samotných aplikací (s konfiguračními hodnotami atd.), musíte Flasku explicitně sdělit, jakou aplikaci má aktuální aplikaci přiřadit k kontext aplikace .
Dokumenty poskytují způsob, jak to můžete udělat..
# 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" )
Budete tedy muset vytvořit samotný objekt aplikace a poté použít with app.app_context()
čára. V rámci tohoto příkazu by měly všechny vaše hovory (například hovory na vaši pobočku Mongo) fungovat. Všimněte si, že nic z toho nemusíte v pohledu dělat, protože Flask to všechno automaticky udělá v rámci zpracování požadavku.