Meget enkelt, RequestHandler-objektet instansieres for hver anmodning. Hvilket betyder, at det cachelagrede objekt, du gemmer, er på RequestHandler-objektet (f.eks. expand).
Hvis du skulle tilføje et simpelt "print 'CREATED!'" til dbmongo(...)-funktionen, ville du se, at det oprettes på hver GET-anmodning.
Det, du skal gøre, er at knytte handleren til klasseobjektet eller en "global" efter behov, selvom det bedste er at sætte det på Tornado Application-objektet.
Simpelt:
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
Anden tilgang er bare at gøre den til en global i din fil:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Begge disse har det samme problem, som er, at hvis du har mange klasser, der vil bruge DB-forbindelsen, er det sværere at dele den. Da DB er en delt enhed, vil du sandsynligvis have en til hele din applikation.
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()