Ganz einfach, das RequestHandler-Objekt wird für jede Anfrage instanziiert. Das bedeutet, dass sich das zwischengespeicherte Objekt, das Sie speichern, im RequestHandler-Objekt (z. B. expand) befindet.
Wenn Sie der dbmongo(...)-Funktion ein einfaches "print 'CREATED!'" hinzufügen würden, würden Sie sehen, dass es bei jeder GET-Anforderung erstellt wird.
Was Sie tun müssen, ist, den Handler an das Klassenobjekt oder an ein "globales" Objekt anzuhängen, obwohl es am besten ist, es auf das Tornado-Anwendungsobjekt zu legen.
Ganz einfach:
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
Der zweite Ansatz besteht darin, es einfach in Ihrer Datei global zu machen:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Beide haben das gleiche Problem:Wenn Sie viele Klassen haben, die die DB-Verbindung verwenden möchten, ist es schwieriger, sie gemeinsam zu nutzen. Da die DB eine gemeinsam genutzte Entität ist, möchten Sie wahrscheinlich eine für Ihre gesamte Anwendung.
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()