pymongo.errors.ConfigurationError:必须安装 "dnspython" 模块才能使用 mongodb+srv:// URI,即使在安装了 pymongo 和 dnspyt



我尝试使用pymongo连接MongoDB。但是,即使在安装了pymongo和dnspython之后,我也遇到了必须安装dnspython的错误。

我的代码是:

import pymongo
USER = ''
PASSWORD = ''
client = pymongo.MongoClient(
"mongodb+srv://" + USER + ":" + PASSWORD + "@tbn-ph9ol.mongodb.net/test?retryWrites=true&w=majority")
db = client["tbn"]
collection = db["inputs"]
post = {"_id": 0,
"temperature": 37,
}
collection.insert_one(post)

为什么 mongodb 无法识别我已经安装了 pymongo 和 dnspython?

您的问题是您正在运行的环境中没有安装dnspython。如果您确实安装了 dnspython,您将不会收到此错误消息。

这很容易在 docker 中使用暂存环境来证明;使用 docker 启动容器:

docker run --rm -it python:3.8.1-buster /bin/bash

然后在 shell 上运行以下命令,在仅安装 pymongo 的新 venv 中创建和运行程序:

cd "$(mktemp -d)"
python -m venv venv
. venv/bin/activate
pip install --upgrade pip
pip install pymongo
cat << EOF > test.py
import pymongo
USER = 'x'
PASSWORD = 'y'
client = pymongo.MongoClient(
"mongodb+srv://" + USER + ":" + PASSWORD + "@tbn-ph9ol.mongodb.net/test?retryWrites=true&w=majority")
db = client["tbn"]
collection = db["inputs"]
post = {"_id": 0,
"temperature": 37,
}
collection.insert_one(post)
EOF
pip freeze && python test.py

应会看到以下输出:

pymongo==3.10.1
Traceback (most recent call last):
File "test.py", line 5, in <module>
client = pymongo.MongoClient(
File "/tmp/tmp.vdpqnMOnFO/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 619, in __init__
res = uri_parser.parse_uri(
File "/tmp/tmp.vdpqnMOnFO/venv/lib/python3.8/site-packages/pymongo/uri_parser.py", line 390, in parse_uri
raise ConfigurationError('The "dnspython" module must be '
pymongo.errors.ConfigurationError: The "dnspython" module must be installed to use mongodb+srv:// URIs

您将观察到您遇到的错误。现在添加 dnspython 并再次运行:

pip install dnspython
pip freeze && python test.py

现在,您将看到一条身份验证失败消息,因为我们没有正确的用户名和密码。从pip freeze命令可以看出,这次安装了 dnspython。

dnspython==1.16.0
pymongo==3.10.1
Traceback (most recent call last):
File "test.py", line 16, in <module>
collection.insert_one(post)
File "/tmp/tmp.vdpqnMOnFO/venv/lib/python3.8/site-packages/pymongo/collection.py", line 695, in insert_one
...
... <snip>
...
pymongo.errors.OperationFailure: Authentication failed.

不要忘记导入模块:

import dns

即使在安装了dnspython和pymongo之后,我也遇到了这个错误。

但是可以通过安装 dnspython 的 1.16.0 版本来简单地解决该错误。

pip install dnspython==1.16.0
pip install pymongo

最新更新