Rất đơn giản, đối tượng RequestHandler được khởi tạo cho mọi yêu cầu. Có nghĩa là đối tượng được lưu trong bộ nhớ cache mà bạn đang lưu nằm trên đối tượng RequestHandler (ví dụ:mở rộng).
Nếu bạn thêm một "print 'CREATED!'" Đơn giản vào hàm dbmongo (...), bạn sẽ thấy rằng nó được tạo theo mọi yêu cầu GET.
Những gì bạn cần làm là đính kèm trình xử lý vào đối tượng lớp hoặc "toàn cục" nếu cần, mặc dù trường hợp tốt nhất là đặt nó vào đối tượng Ứng dụng Tornado.
Đơn giản:
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
Cách tiếp cận thứ hai chỉ là làm cho nó trở thành toàn cầu trong tệp của bạn:
dbmongo_connection = None
def dbmongo():
if not dbmongo_connection:
dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
return dbmongo_connection
Cả hai đều có chung một vấn đề là nếu bạn có nhiều lớp muốn sử dụng kết nối DB, thì việc chia sẻ nó sẽ khó hơn. Vì DB là một thực thể được chia sẻ nên bạn có thể muốn một thực thể cho toàn bộ ứng dụng của mình.
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()