2015-02-07 56 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