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という3番目のモジュールを作成することです。そこでグローバル変数接続を作成するか、常に同じ接続を返す単純なシングルトンクラスを作成するか、またはそのような単純な関数getConnection()が常にグローバル接続を返します。このように、循環インポートはなく、他のモジュールはインポートできますdb

于 2012-06-13T17:44:03.203 に答える
1

わかりました、私は問題を解決することができました。これは、モジュールのロード順序のいくつかの不一致に関連していました。

ただし、1つの接続インスタンスをキャッシュしてから、アプリケーションの存続期間全体にわたってそれを使用することはまったく問題ありません。そして、これはスレッド化されたアプリケーションにも当てはまります。

于 2012-06-13T17:39:19.673 に答える