Mycket enkelt, RequestHandler-objektet instansieras för varje begäran. Vilket betyder att det cachade objektet som du sparar finns på RequestHandler-objektet (t.ex. expandera).
Om du skulle lägga till en enkel "skriv ut 'SKAPAD!'" till dbmongo(...)-funktionen skulle du se att den skapas vid varje GET-förfrågan.
Vad du behöver göra är att koppla hanteraren till klassobjektet, eller en "global" efter behov, men det bästa fallet är att placera den på Tornado Application-objektet.
Enkelt:
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
Det andra tillvägagångssättet är bara att göra det till ett globalt i din fil:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Båda dessa har samma problem som är att om du har många klasser som vill använda DB-anslutningen är det svårare att dela den. Eftersom DB är en delad enhet vill du förmodligen ha en för hela 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()