2015-02-07 58 views
0

我遵循金字塔食谱说明MongoDB and Pyramid,但似乎链接数据库查询request.db,我只能从我的意见。 如何打开可以从类方法内部调用的连接?如何访问金字塔视图之外的MongoDB连接?

我想为我的项目中的对象设置一个真正的准系统序列化程序。我在我的resources/文件夹中有许多类定义来处理我的项目数据。我想给每个这些对象自包含.save().find()方法(类似于mongoengine),它会将对象的数据转换为字典并使用pymongo将该字典保存到MongoDB。

使用pymongo很容易打开到MongoDB的连接。你所要做的就是使用MongoClient。问题是我不想在每次实例化对象或调用类时都打开一个新连接。我想要在蛋的main()函数中创建一个连接,然后我可以在需要时访问它(就像视图中的request.db一样)。

很显然,我是金字塔全新的,所以任何帮助表示赞赏。提前致谢。

回答

0

我会创建一个模块来初始化和保存资源/包内的MongDB连接。

E.g.资源/ connection.py

import pymongo 

db = None 

def initialize(settings): 
    global db 
    db = MongoClient(settings['mongo_uri']) 

然后在你的应用程序的主要功能:

from myapp.resources import connection 


def main(global_config, **settings): 
    # ... 
    connection.initialize(settings) 
    # ... 
    config.add_request_method(lambda request: connection.client, 'db', reify=True) 

在任何其他模块(未查看),只需要导入连接模块:

from myapp.resources import connection 

connection.db.posts 

恕我直言,这方法比食谱中描述的方法更具可扩展性和单元可测试性。

+0

请注意,当线程开始时,这种方法可能会以不可预知的方式破坏,您想要使用threadlocal对象。 Cookbook的答案要好得多,这要求你将请求传递给你的模型,但是在大多数情况下这不是问题,并且增加了可测试性。 – 2015-02-26 03:56:23

+0

pymongo的MongoClient是线程安全的,充当现实中的连接池。 [链接](http://api.mongodb.org/python/current/faq.html#how-does-connection-pooling-work-in-pymongo) – 2015-02-27 08:41:24