Molto semplice, l'oggetto RequestHandler viene istanziato per ogni richiesta. Ciò significa che l'oggetto memorizzato nella cache che stai salvando si trova sull'oggetto RequestHandler (ad es. Espandi).
Se dovessi aggiungere un semplice "print 'CREATED!'" alla funzione dbmongo(...) vedresti che viene creato su ogni richiesta GET.
Quello che devi fare è collegare il gestore all'oggetto classe, o un "globale" secondo necessità, anche se il caso migliore è inserirlo nell'oggetto Tornado Application.
Semplice:
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
Il secondo approccio è solo quello di renderlo globale nel tuo file:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Entrambi hanno lo stesso problema che è che se hai molte classi che vogliono usare la connessione DB, è più difficile condividerla. Poiché il DB è un'entità condivisa, probabilmente ne vuoi uno per l'intera applicazione.
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()