Om deze fout te begrijpen, moet u de toepassingscontext begrijpen .
Het is heel goed mogelijk voor iemand om meerdere Flask-applicaties te schrijven die allemaal hun verzoeken in hetzelfde proces afhandelen. De documenten geven het volgende voorbeeld...
from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend
application = DispatcherMiddleware(frontend, {
'/backend': backend
})
Houd er rekening mee dat in dit geval de frontend-app verschillende Mongo-configuraties kan gebruiken, maar exact hetzelfde Mongo-extensie-object. Om deze reden kan Flask niet aannemen wat de "huidige" app is wanneer u een script uitvoert. Daarom kunnen dingen als url_for()
, of veel van de methoden op extensies zoals de MongoDB-extensie, moeten weten welke applicatie de "huidige" is voordat ze iets doen.
Daarom moet u, telkens wanneer u Flask- of uitbreidingsfuncties probeert te gebruiken om iets anders te doen dan de toepassingen zelf in te stellen (met configuratiewaarden, enz.), Flask expliciet vertellen wat de huidige app is die moet worden toegewezen aan de toepassingscontext .
De documenten geven een manier waarop u dit kunt doen..
# 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" )
U moet dus het app-object zelf maken en vervolgens de with app.app_context()
gebruiken lijn. Binnen dat met-statement zouden al uw oproepen (zoals die naar uw Mongo-extensie) moeten werken. Houd er rekening mee dat u dit in een weergave niet hoeft te doen, omdat Flask dit allemaal automatisch doet als onderdeel van de verwerking van een verzoek.