flask_pymongo:PyMongo 与 MongoClient:[SSL:CERTIFICATE_VERIFY_FAILED]
flask_pymongo : PyMongo vs MongoClient : [SSL: CERTIFICATE_VERIFY_FAILED]
我有一个巨大的烧瓶应用程序,我使用 flask_pymongo
中的 PyMongo
class 进行 MongoDB 操作。我的问题是在开发环境中。
我的 config.py
中有一个 MONGO_URI
是这样的:
MONGO_URI = "mongodb+srv://username:password@cluster-name.pihvl.gcp.mongodb.net/db_name?retryWrites=true&w=majority"
我的应用中的用法如下所示:
# This is how I have initialized it in '__init__.py'
from flask_pymongo import PyMongo
mongo = PyMongo(app)
# This is how I access collections in the specified DB
document = mongo.db[collection_name].find() # Throws the below error
直到几天前我重新安装 Windows 和 Python 之前,它一直运行良好。
现在相同的代码抛出以下错误:
pymongo.errors.ServerSelectionTimeoutError: cluster-name-shard-00-01.pihvl.gcp.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
但是使用 MongoClient
而不是 PyMongo
效果很好,就像这样:
# Using MongoClient and setting 'ssl_cer_reqs'
from flask_pymongo import MongoClient
import ssl
mongo = MongoClient(app.config['MONGO_URI'], ssl_cert_reqs=ssl.CERT_NONE)
# This works just fine
document = mongo[db_name][collection_name].find()
问题
当我重新安装所有内容时,PyMongo
有什么变化?我不想使用 MongoClient
只是因为有超过 100 个端点,现在转移是一场噩梦,而且我更喜欢 PyMongo
因为我不必指定 db_name
在每个查询中,它从 MONGO_URI
.
中获取
我缺少什么以及如何让它与 PyMongo
一起使用?有没有办法在使用 PyMongo
时设置 ssl_cert_reqs
?
证书链中的某些内容将发生变化。 pymongo 有关于如何解决这个问题的具体文档:
https://pymongo.readthedocs.io/en/stable/examples/tls.html#troubleshooting-tls-errors
重要提示:仅当您在开发环境中遇到此问题时才执行此操作
我所要做的就是将 &ssl=true&ssl_cert_reqs=CERT_NONE
添加到我的 Development Configuration
中的 MONGO_URI
所以现在我的 uri
将从:
mongodb+srv://username:password@cluster-name.pihvl.gcp.mongodb.net/db_name?retryWrites=true&w=majority
至:
mongodb+srv://username:password@cluster-name.pihvl.gcp.mongodb.net/db_name?retryWrites=true&w=majority&ssl=true&ssl_cert_reqs=CERT_NONE
pip 安装证书
import pymongo
import certifi
myclient = pymongo.MongoClient(CONNECTION_STRING, tlsCAFile=certifi.where())
...
我有一个巨大的烧瓶应用程序,我使用 flask_pymongo
中的 PyMongo
class 进行 MongoDB 操作。我的问题是在开发环境中。
我的 config.py
中有一个 MONGO_URI
是这样的:
MONGO_URI = "mongodb+srv://username:password@cluster-name.pihvl.gcp.mongodb.net/db_name?retryWrites=true&w=majority"
我的应用中的用法如下所示:
# This is how I have initialized it in '__init__.py'
from flask_pymongo import PyMongo
mongo = PyMongo(app)
# This is how I access collections in the specified DB
document = mongo.db[collection_name].find() # Throws the below error
直到几天前我重新安装 Windows 和 Python 之前,它一直运行良好。 现在相同的代码抛出以下错误:
pymongo.errors.ServerSelectionTimeoutError: cluster-name-shard-00-01.pihvl.gcp.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
但是使用 MongoClient
而不是 PyMongo
效果很好,就像这样:
# Using MongoClient and setting 'ssl_cer_reqs'
from flask_pymongo import MongoClient
import ssl
mongo = MongoClient(app.config['MONGO_URI'], ssl_cert_reqs=ssl.CERT_NONE)
# This works just fine
document = mongo[db_name][collection_name].find()
问题
当我重新安装所有内容时,PyMongo
有什么变化?我不想使用 MongoClient
只是因为有超过 100 个端点,现在转移是一场噩梦,而且我更喜欢 PyMongo
因为我不必指定 db_name
在每个查询中,它从 MONGO_URI
.
我缺少什么以及如何让它与 PyMongo
一起使用?有没有办法在使用 PyMongo
时设置 ssl_cert_reqs
?
证书链中的某些内容将发生变化。 pymongo 有关于如何解决这个问题的具体文档:
https://pymongo.readthedocs.io/en/stable/examples/tls.html#troubleshooting-tls-errors
重要提示:仅当您在开发环境中遇到此问题时才执行此操作
我所要做的就是将 &ssl=true&ssl_cert_reqs=CERT_NONE
添加到我的 Development Configuration
中的 MONGO_URI
所以现在我的 uri
将从:
mongodb+srv://username:password@cluster-name.pihvl.gcp.mongodb.net/db_name?retryWrites=true&w=majority
至:
mongodb+srv://username:password@cluster-name.pihvl.gcp.mongodb.net/db_name?retryWrites=true&w=majority&ssl=true&ssl_cert_reqs=CERT_NONE
pip 安装证书
import pymongo
import certifi
myclient = pymongo.MongoClient(CONNECTION_STRING, tlsCAFile=certifi.where())
...