2017-05-26 70 views
0

是什么连接到MongoDB服务器与models.py模块在下面的两行,然后import models.py内部views.py之间的差:连接到MongoDB的(或任何其他数据库服务器)与金字塔

from pymongo import MongoClient 
db = MongoClient()['name'] 

与添加dbrequestherehere所述?

我刚刚开始玩Pyramid和MongoDb,我用第一种方法,效果很好。然后我发现人们使用第二种方法。

我做错了什么?

+0

我不认为你的方法有任何错误/不同。在你的情况下,你需要在你需要的所有文件中导入你的'db'。在这些例子中,它已经可以在'request'中找到。 –

+0

@AntoineLeclair我的视图导入'models.py'。大部分工作是在该模块内完成的,当我在视图中需要'db'时,我将从'models.py'中导入它。我认为它更清洁,更符合我的方式(明确优于隐含)。但我想知道我是否有冒险打破某些东西或错过金字塔基础设施提供的某些功能。 – stenci

+1

我认为你100%正确。我猜人们以另一种方式来做,因为在事务中使用SQLAlchemy时,如果直接在请求中注入“db”作用域(而不是依赖threadlocals),则更容易管理事务。他们习惯了这种模式,所以他们继续使用它与其他数据库/库。 –

回答

0

没有什么错你在做什么,但它的情况下,你的应用程序将变得不太复杂的面向未来。您使用的模式有时被称为“使用模块作为单例”。第一次导入模块时,代码将运行,创建一个模块级别的对象,可以从任何其他从该模块导入的代码中使用该对象。这没什么不妥,这是一个普通的Python模式,也是你在python领域看不到单身模板的原因。

但是,在一个复杂的应用程序中,无论什么时候输入什么内容,都可以精确控制什么时候发生。当我们根据文档示例在配置时创建客户端时,您知道它是在配置(服务器启动)块运行时创建的,而不是任何时候任何代码导入您的模块,并且从此知道它是可通过您的注册表获得,可通过请求对象在金字塔应用程序中的任何位置访问。这是普通的金字塔最佳实践:在服务器上建立所有你需要的一次性共享请求机制,在你创建配置器的代码中启动代码,并且(可能)将它们附加到配置器或其注册表中。

这与我们将事物挂接到请求生命周期回调中的原因相同,它使我们能够知道某个每个请求代码执行的位置和时间,并确保清理助手总是在请求生命周期。因此,对于数据库访问,我们在config startup中创建共享机器,并在请求开始时创建每个连接代码,然后在请求结束时进行清理。对于SQL数据库,这意味着启动事务,然后在最后提交或回滚。

因此,您的应用程序现在可能并不重要,但它是扩大代码库的好习惯。大部分金字塔设计决策都是针对复杂的代码情况而做出的。