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())
...