3

我在应用程序启动之前创建一个连接实例

# app.py
mongodb_conn = pymongo.Connection(host=host, port=int(port), safe=True)

print(mongodb_conn) # Connection('127.0.0.1', 27017)

...

bottle.run(...)

但是,然后在我的请求中,当我尝试从其他模块访问此连接时,它错误地说mongodb_connNone

# user.py
from app import mongodb_conn
...

db = mongodb_conn['somedb'] # TypeError: 'NoneType' object is not subscriptable

有人可以解释发生了什么吗?

4

2 回答 2

1

我知道您在回答中已经提到您由于模块顺序问题而解决了它,但我想包括一个扩展的答案。

在没有看到更多代码的情况下,我假设您正在设置一些循环导入,其中连接在您的 app.py 中定义,它可能也导入您的 user.py,但随后您的 user.py 导入 app.py 用于连接对象。mongodb_conn在那一点上很可能是不相关的。

我建议您创建一个名为 db.py 的第三个模块。在那里创建一个全局变量连接,或者,创建一个总是返回相同连接的简单单例类,或者,一个像getConnection()这样的简单函数总是返回全局连接。这样,您将不会有循环导入,并且任何其他模块都可以导入db

于 2012-06-13T17:44:03.203 回答
1

好的,我已经能够解决问题了。这与模块加载顺序的一些差异有关。

但是,缓存一个连接实例然后在应用程序的整个生命周期中使用它是完全可以的。即使对于线程应用程序也是如此。

于 2012-06-13T17:39:19.673 回答