非常に単純で、RequestHandlerオブジェクトはすべてのリクエストに対してインスタンス化されます。これは、保存しているキャッシュオブジェクトがRequestHandler(例:expand)オブジェクト上にあることを意味します。
単純な「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
2番目のアプローチは、ファイル内でグローバルにすることです。
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
これらは両方とも同じ問題を抱えています。それは、DB接続を使用したいクラスがたくさんある場合、それを共有するのが難しいということです。 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()