Много просто, обектът RequestHandler се инстанцира за всяка заявка. Което означава, че кешираният обект, който запазвате, е на обекта RequestHandler (например разширяване).
Ако трябваше да добавите прост "print 'CREATED!'" към функцията dbmongo(...), ще видите, че тя се създава при всяка GET заявка.
Това, което трябва да направите, е да прикачите манипулатора към обекта на класа или „глобален“, ако е необходимо, въпреки че най-добрият случай е да го поставите върху обекта на приложението Tornado.
Просто:
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
Вторият подход е просто да го направите глобален във вашия файл:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
И двете имат един и същ проблем, който е, че ако имате много класове, които искат да използват DB връзката, е по-трудно да я споделите. Тъй като DB е споделен обект, вероятно искате такъв за цялото си приложение.
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()