Bardzo proste, obiekt RequestHandler jest tworzony dla każdego żądania. Oznacza to, że zapisywany obiekt w pamięci podręcznej znajduje się w obiekcie RequestHandler (np. expand).
Gdybyś miał dodać proste "print 'CREATED!'" do funkcji dbmongo(...) zobaczyłbyś, że jest on tworzony przy każdym żądaniu GET.
To, co musisz zrobić, to dołączyć procedurę obsługi do obiektu klasy lub, w razie potrzeby, „globalną”, chociaż najlepiej jest umieścić ją w obiekcie aplikacji Tornado.
Proste:
Konfiguracja klasyclass 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
Drugie podejście to po prostu uczynienie go globalnym w twoim pliku:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Oba mają ten sam problem, który polega na tym, że jeśli masz wiele klas, które chcą korzystać z połączenia DB, trudniej jest je udostępnić. Ponieważ baza danych jest jednostką współdzieloną, prawdopodobnie potrzebujesz jej dla całej aplikacji.
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()