私は使用しています:
uWSGI開始パラメーター:
_--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2
_
MongoClientを1回セットアップしました。
_self.mongo_client = MongoClient('mongodb://user:[email protected]:port/mydb')
self.db = self.mongo_client['mydb']
_
JSON dictをMongoDBに保存してみます:
_result = self.db.jobs.insert_one(job_dict)
_
Mongodbへの同じコードパスを実行する単体テストを介して動作します。ただし、HTTP POSTを使用してCherryPyおよびuWSGIで実行すると、次のようになります。
_pymongo.errors.ServerSelectionTimeoutError: No servers found yet
_
CherryPyおよびuWSGIを介して実行すると、なぜこの動作が見られますか?これはおそらくPyMongo 3の新しいスレッドモデルですか?
更新:
CherryPy組み込みサーバーを使用してuWSGIとnginxなしで実行すると、insert_one()
が機能します。
更新1/25 EST 4:53 pm:
PyMongoにデバッグを追加した後、topology._update_servers()
は、サーバー 'myserver-a.mongolab.com'のserver_type = 2を知っているようです。ただし、server_description.known_servers()
のサーバー 'myserver.mongolab.com'のserver_type = 0があります
これにより、次のスタックトレースが発生します。
_result = self.db.jobs.insert_one(job_dict)
File "/usr/local/lib/python3.4/site-packages/pymongo/collection.py", line 466, in insert_one
with self._socket_for_writes() as sock_info:
File "/usr/local/lib/python3.4/contextlib.py", line 59, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.4/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 97, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
_
PYTHON-961 で追跡されているこの問題を調査しています。 MongoClientのインスタンスを作成するときにconnect = Falseを渡すことで、この問題を回避できる場合があります。これは、最初のデータベース操作が試行されるまでバックグラウンド接続を延期し、MongoClientのモニタースレッドのスピンアップとマルチプロセスフォークとの間の競合状態を回避します。
Pymongo 3.0から2.8にダウングレードして、自分で修正しました。何が起こっているのか分かりません。
flask/bin/pip uninstall pymongo
flask/bin/pip install pymongo==2.8
Pymongo 3.5でも同じ問題がありました。localhostを127.0.0.1に置き換えるか、mongodbインスタンスの対応するIPアドレスで問題が解決します。
私もこれに遭遇しました。
これは、 pymongo3はフォークセーフではない が原因である可能性があります。
これを修正するには、--lazy-apps
paramをuwsgiに追加します。これにより、「フォークセーフ」問題を回避できます。
uwsgi doc preforking-vs-lazy-apps-vs-lazy を参照してください。
この2つが確実に接続されているかどうかはわかりません。
私は同じ問題に遭遇し、最終的にクライアントIPがmongoサーバーのファイアウォールによってブロックされていることを発見しました。
私はpymongo 3.2を使用していますが、同じエラーに遭遇しましたが、私の場合は設定ミスでした。許可を有効にした後、接続のタイムアウトになるURLのポートを更新するのを忘れました。通常、アプリケーションデータを格納するデータベースとは異なるため、?authSourceが必要になる可能性があることに言及する価値があります。
Dnspythonをインストールしてこれを解決しました(pip install dnspython)。問題は、「mongodb + srv:// URIを使用するには「dnspython」モジュールをインストールする必要がある」ということです。
サーバーのIPアドレスをmongod.confファイルに追加してみてください。 linux(ubuntu)osを使用している場合、私の解決策を試すことができます:
mongod.confファイルを変更します。
vi /etc/mongod.conf
127.0.0.1の後ろにmongodbサーバーのIPアドレスを追加して保存できます。
net:
port:27017
bindIp:127.0.0.1,mongodb server ip
最終的に:
Sudo service mongod restart
これで、pymongo MongoClientを使用してmongodbの接続を試みることができます。
バックグラウンドで実行されているMongoDBサーバーがないため、このエラーが発生しました。 MongoDBサーバーを実行するには、cmdまたはanacondaプロンプトを開き、次のように入力します-
"C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe"
その後、実行します
import pymongo
myclient = pymongo.MongoClient()
mydb = myclient["mydatabase"]
myclient.list_database_names()