Python中Flask使用PyMongo连接MongoDB报错ServerSelectionTimeoutError: No servers found yet如何解决

在写接口的时候,因为当初的弱智,没有选择 Flask-PyMongo 等库在初始化 app 的时候一并初始化 mongo 示例,而是在每个接口里创建一个 mongoClient。。

mongo = MongoClient(mongo_uri, connect=False)

最近新业务里,需要一个会被频繁访问,且会进行数据库查询的接口。

 ```
 # 这是逻辑函数的开始
 device_id = query_data['deviceId']
 collection = mongo.app.user

user_data = collection.find_one({“deviceId”: device_id})

后面还有很多但是没有必要所以省略了

</code></pre>
<p>然后发现该接口会偶尔出现下面的报错信息,但是其他会使用到 Mongo 的接口却没有出现过这个问题。报错信息如下:</p>
<pre><code> ```
Traceback (most recent call last):
  File "/root/py27test/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/root/py27test/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/root/py27test/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/root/py27test/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/root/py27test/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  # 这里是接口的部分
  File "./utils/v5.py", line 47, in decorated_function
    return f(*args, **kwargs)
  File "./utils/v5.py", line 1081, in user_function
    data, error_message = query_module.query(query_data, mongo)
  File "./fetcher/tools_v4.py", line 81, in user_query
    user_data = collection.find_one({"deviceId": device_id})
  # 接口的部分结束
  File "/root/py27test/lib/python2.7/site-packages/pymongo/collection.py", line 1262, in find_one
    for result in cursor.limit(-1):
  File "/root/py27test/lib/python2.7/site-packages/pymongo/cursor.py", line 1189, in next
    if len(self.__data) or self._refresh():
  File "/root/py27test/lib/python2.7/site-packages/pymongo/cursor.py", line 1087, in _refresh
    self.__session = self.__collection.database.client._ensure_session()
  File "/root/py27test/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1558, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/root/py27test/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1511, in __start_session
    server_session = self._get_server_session()
  File "/root/py27test/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1544, in _get_server_session
    return self._topology.get_server_session()
  File "/root/py27test/lib/python2.7/site-packages/pymongo/topology.py", line 427, in get_server_session
    None)
  File "/root/py27test/lib/python2.7/site-packages/pymongo/topology.py", line 199, in _select_servers_loop
    self._error_message(selector))
ServerSelectionTimeoutError: No servers found yet

[汗]搜索了 stackoverflow 的解决方法一个是connect=False,另一个是在 fork 前等待两秒。似乎不太适用,猛男落泪,所以来求助一哈各位大佬。

Python:2.7.5 PyMongo:3.7.1


Python中Flask使用PyMongo连接MongoDB报错ServerSelectionTimeoutError: No servers found yet如何解决

2 回复

这个错误通常是因为PyMongo无法连接到MongoDB服务器。检查以下几点:

  1. 连接字符串格式:确保URI格式正确
# 正确的格式
# 本地:mongodb://localhost:27017/
# 带认证:mongodb://username:password@host:27017/dbname
# 集群:mongodb://host1:27017,host2:27017/?replicaSet=rs0

from pymongo import MongoClient

# 示例连接代码
client = MongoClient(
    'mongodb://localhost:27017/',
    serverSelectionTimeoutMS=5000  # 设置超时时间
)
  1. MongoDB服务状态
# 检查MongoDB是否运行
sudo systemctl status mongod
# 或
ps aux | grep mongod
  1. 防火墙和端口
# 检查27017端口是否开放
netstat -tlnp | grep 27017
# 或
sudo ufw status  # Ubuntu防火墙
  1. 完整示例
from flask import Flask
from pymongo import MongoClient
import pymongo

app = Flask(__name__)

try:
    # 增加连接参数
    client = MongoClient(
        'mongodb://localhost:27017/',
        serverSelectionTimeoutMS=5000,
        connectTimeoutMS=3000,
        socketTimeoutMS=3000
    )
    
    # 测试连接
    client.admin.command('ping')
    print("连接成功")
    
    db = client['mydatabase']
    
except pymongo.errors.ServerSelectionTimeoutError as e:
    print(f"连接失败: {e}")
    # 可能是:1. MongoDB没启动 2. 主机名/IP错误 3. 端口被防火墙阻挡
except Exception as e:
    print(f"其他错误: {e}")

快速排查:先确保MongoDB服务已启动且能通过mongo命令行连接。

总结:检查MongoDB服务状态和连接参数。


试试连接池吧,原来遇到 redis 的时候也是这样, 用链接池好多了, 看看这个
http://api.mongodb.com/python/current/faq.html#how-does-connection-pooling-work-in-pymongo

回到顶部