Heel eenvoudig, het RequestHandler-object wordt voor elk verzoek geïnstantieerd. Wat betekent dat het in de cache opgeslagen object dat u opslaat zich op het RequestHandler-object (bijvoorbeeld uitvouwen) bevindt.
Als je een simpele "print 'CREATED!'" aan de dbmongo(...)-functie zou toevoegen, zou je zien dat deze bij elk GET-verzoek wordt aangemaakt.
Wat u moet doen, is de handler aan het klasseobject koppelen, of een "algemeen" indien nodig, hoewel u deze het beste op het Tornado Application-object kunt plaatsen.
Simpel:
class setup(tornado.web.RequestHandler):
@classmethod
def dbmongo(cls):
if not hasattr(cls, '_dbmongo'):
cls._dbmongo = apymongo.Connection("127.0.0.1", 27017)
return cls._dbmongo
De tweede benadering is om er gewoon een globaal van te maken in je bestand:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Beide hebben hetzelfde probleem, namelijk dat als je veel klassen hebt die de DB-verbinding willen gebruiken, het moeilijker is om deze te delen. Aangezien de DB een gedeelde entiteit is, wilt u er waarschijnlijk een voor uw hele applicatie.
class MongoMixin(object):
def mongodb(self):
if not hasattr(self.application, 'mongodb'):
self.application.mongodb = apymongo.Connection(self.application.settings.get("mongohost", "127.0.0.1"), 27017)
return self.application.mongodb
class expand(tornado.web.RequestHandler, MongoMixin):
def get(self):
db = self.mongodb()