65

我在用着:

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongolab 运行 mongod 2.6.9
  • uWSGI 2.0.10
  • 樱桃派 3.7.0
  • nginx 1.6.2

uWSGI 启动参数:

--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2

我设置了我的 MongoClient 一次:

self.mongo_client = MongoClient('mongodb://user:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']

我尝试将 JSON 字典保存到 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 下午 4:53 EST:

在 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
4

28 回答 28

64

我们正在调查这个问题,在PYTHON-961中跟踪。您可以通过在创建 MongoClient 实例时传递connect=False来解决此问题。这将后台连接推迟到尝试第一个数据库操作,避免我怀疑是 MongoClient 的监视线程启动和多进程分叉之间的竞争条件。

于 2015-07-02T21:31:45.037 回答
25

如此处所述:https ://stackoverflow.com/a/54314615/8953378

我添加?ssl=true&ssl_cert_reqs=CERT_NONE到我的连接字符串中,它解决了这个问题。

所以而不是:

connection_string = "mongodb+srv://<USER>:<PASSWORD>@<CLUSTER>/<COLLECTION>"

我写:

connection_string = "mongodb+srv://<USER>:<PASSWORD>@<CLUSTER>/<COLLECTION>?ssl=true&ssl_cert_reqs=CERT_NONE"

(请注意,如果您的连接字符串中有其他参数,则需要将 更改?&

于 2019-10-10T05:42:24.737 回答
13

我通过从 pymongo 3.0 降级到 2.8 为自己修复了它。不知道发生了什么。

   flask/bin/pip uninstall pymongo
   flask/bin/pip install pymongo==2.8
于 2015-07-01T14:47:11.400 回答
9

我不确定您是否将 MongoDB 与 AWS 云服务配对使用。但如果你是,我发现你必须指定你希望 MongoDB 可以访问的 IP 地址。

因此,您需要做的是添加主机服务器的 IP 地址以允许进入。

在 MongoAtlas 中,可以在此页面完成 在此处输入图像描述

我知道已经有相同问题的解决方案,但我没有找到对我的情况有帮助的解决方案,所以想发布这个,以便其他人在遇到与我相同的问题时可以受益。

于 2018-05-30T01:59:39.733 回答
7

我在 Pymongo 3.5 上遇到了同样的问题 结果用 127.0.0.1 或 mongodb 实例的相应 IP 地址替换 localhost 可以解决问题。

于 2017-09-17T15:15:25.680 回答
4

我通过安装 dnspython(pip install dnspython)解决了这个问题。问题是:“必须安装“dnspython”模块才能使用 mongodb+srv:// URIs”

于 2019-06-02T19:42:07.350 回答
3

就我而言

  • 我正在使用 Mongo Atlas
  • 路由器重启后我得到了另一个 IP 地址

因此我必须通过将该 IP 添加到Mongo Atlas 设置的白名单中

MongoAtlas website -> Network Access -> IP Whitelist -> Add IP Address -> Add Current IP Address

然后等待 IP 地址的状态变为活动,然后尝试再次运行应用程序

如果您使用 repl.it 服务器托管,只需添加您用于配置服务器的主机 ip,对我来说是 0.0.0.0,这是最常见的

于 2020-08-04T02:34:39.567 回答
2

我今天面临同样的例外。就我而言,代理设置可能会阻止连接,因为我可以通过更改 wifi建立与 mongodb 的成功连接。即使这个问题已被标记为已解决,它也有望缩小其他一些问题的范围。

于 2020-06-10T15:04:19.887 回答
1

我遇到了同样的问题,最后我发现客户端IP被mongo服务器的防火墙阻止了。

于 2016-07-27T07:11:14.420 回答
1

我也遇到过这个。

这可能是因为pymongo3 is not fork safe

我通过将--lazy-apps参数添加到 uwsgi 来解决这个问题,这可以避免“分叉安全”问题。

看到 uwsgi doc preforking-vs-lazy-apps-vs-lazy

请注意,不确定这两者是否具有积极的联系。

于 2016-12-28T10:02:26.213 回答
0

开发人员正在调查这个问题,在PYTHON-961中跟踪。您可以通过手动运行 mongod.exe 并对其进行监控来解决此问题。当控制台冻结时会出现此问题,如果 mongod 控制台卡住,您可以按 Enter。在开发人员修复此错误之前,这是目前最简单的解决方案。

于 2020-07-04T09:07:17.907 回答
0

确保您输入的是用户密码,而不是 MongoDB 帐户密码。我遇到了类似的问题。就我而言,我错误地输入了 MongoDB 帐户密码而不是用户密码。

于 2021-12-12T07:16:21.620 回答
0

我在 mongod.conf 中注释掉了 bindIP 变量,而不是允许所有连接(您必须输入 0.0.0.0)。当然,要注意后果。

于 2019-11-09T16:49:34.823 回答
0

也许您可以尝试将您的服务器 IP 地址添加到 mongod.conf 文件中。如果你使用 linux(ubuntu) 操作系统,你可以试试我的解决方案:

  1. 修改 mongod.conf 文件:

    vi /etc/mongod.conf
    

    你可以在127.0.0.1后面添加mongodb服务器ip地址,并保存:

    net:
      port:27017
      bindIp:127.0.0.1,mongodb server ip
    
  2. 在终端:

    sudo service mongod restart

现在,您可以尝试使用 pymongo MongoClient 连接 mongodb。

于 2018-07-24T03:42:20.123 回答
0

我正在使用 pymongo 3.2 并且遇到了同样的错误,但在我的情况下这是一个错误配置。启用授权后,我忘记更新 url 中的端口,导致连接超时。可能值得一提的是 ?authSource 可能是必需的,因为它通常不同于存储应用程序数据的数据库。

于 2019-02-06T13:11:04.607 回答
0

发生该错误是因为后台没有运行 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()
于 2018-11-22T11:39:15.300 回答
0

我只是在选项卡中添加了我当前的 IP 地址network access,因为它会自动更改。删掉之前的那个,IP地址略有变化。

于 2020-12-04T12:11:17.560 回答
0

转到您的 Atlas 控制台 > 网络访问,然后添加您的客户端 IP 地址,例如。0.0.0.0/00(注意:所有客户端ips都可以访问你的数据库)

网络访问页面

于 2021-10-14T06:43:57.980 回答
0

我今天遇到了这个问题。我设法通过以下方式处理它:

安装 dnspython 库 > 转到 MongoDB 网页 > 登录 > 安全 > 网络访问 > 添加 IP 地址 > 添加我的请求来自的 IP 地址。

希望这可以帮助某人。

于 2021-12-03T18:57:44.917 回答
0

当您实例化客户端时,pymongo 3 不会告诉您连接失败。您可能未连接。

https://api.mongodb.com/python/3.5.1/api/pymongo/mongo_client.html

“如果它们不可用,它将不再引发 ConnectionFailure .. 您可以像这样检查服务器是否可用:”

from pymongo.errors import ConnectionFailure
client = MongoClient()
try:
    # The ismaster command is cheap and does not 
require auth.
    client.admin.command('ismaster')
except ConnectionFailure:
    print("Server not available")
于 2020-03-17T15:39:20.947 回答
0

我在开发过程中遇到了同样的问题。这是因为 mongodb 没有在我的本地机器上运行(sudo systemctl restart mongod让 mongodb 在 Ubuntu 上运行)。

于 2020-07-14T12:39:21.510 回答
0

我遇到了同样的问题。2分钟前运行良好的代码给出了这个错误。我在谷歌上寻找解决方案大约 30 分钟,它自动得到修复。问题可能是我的家庭互联网连接。只是猜测,但如果您没有对代码或任何其他配置文件进行任何更改,最好等待一段时间并重试。

于 2022-01-28T10:40:59.203 回答
0

我在 Windows 上遇到了同样的错误,我刚刚启动了 MongoDB 服务

  • 打开服务 ctrl+R 然后输入 services.msc 然后回车
于 2021-01-06T21:37:06.787 回答
0

我一直在努力解决同样的问题。读取并且任何一个插入都没有工作,失败了ServerSelectionTimeoutError

我一直pymongo==3.11.4在 Ubuntu 18.04 LTS 上使用。尝试使用connect=False,将额外?ssl=true&ssl_cert_reqs=CERT_NONE选项传递给我的连接字符串和上面列出的其他建议。在我的情况下,他们没有工作。

最后简单尝试升级到pymongo==3.12.1并且连接开始工作而没有通过connect=false,以及其他extra arguments建议。

    login = '<USERNAME>'
    password = '<PASSWORD>'
    host = '*.mongodb.net'
    db = '<DB>'
    uri = f'mongodb+srv://{login}:{password}@{host}/{db}?retryWrites=true&w=majority'
    client = MongoClient(uri, authsource='admin')#, connect=False)
    collection = client.db.get_collection('collection_name')
    # t = collection.find_one({'hello': '1'})
    t = collection.insert_one({'hello': '2'})
    print(t)
于 2021-11-11T05:03:18.150 回答
0

对于我的情况,我只将我的 ip 允许列表 0.0.0.0 设置为允许任何地方,但您可以使用“我的 ip 是什么”设置您的 ip 并将其复制粘贴到网络访问 > 添加 ip

于 2021-07-04T03:18:32.217 回答
-1

当我刚刚将服务中的MongoDB切换到之前停止的运行时,这个问题就解决了。mongodb服务部分

于 2021-01-12T07:09:33.163 回答
-1

此pull_request已修复PyMongo问题。

于 2016-03-16T16:26:26.610 回答
-2
  • 首先设置MongoDB环境。

  • 在 CMD 上运行 - “C:\Program Files\MongoDB\Server\3.6\bin\mongod.exe”

  • 打开另一个 CMD 并运行它 - "C:\Program Files\MongoDB\Server\3.6\bin\mongo.exe"

然后你可以使用pymongo [anaconda prompt]

import pymongo
from pymongo import MongoClient

client = MongoClient()
db = client.test_db
collection = db['test_coll']

参考 - https://docs.mongodb.com/tutorials/install-mongodb-on-windows/

于 2018-05-29T05:34:21.347 回答