无法使用 MongoEngine 进行身份验证。 PyMongo 工作。如何让 MongoEngine 进行身份验证?

Can't authenticate using MongoEngine. PyMongo works. How do I get MongoEngine to authenticate?

我正在尝试使用 mongoengine.connect() 对 MongoDB 数据库进行身份验证。当我使用 pymongo.MongoClient() 时,代码可以完美运行,但是 mongoenine.connect() 会抛出此错误:

pymongo.errors.OperationFailure: command createRole requires authentication

我相信连接参数是相同的,而且 MongoEngine 仍然使用 PyMongo 进行连接,所以我对这里的问题感到困惑。

我打印了 PyMongo 和 MongoEngine 返回的 MongoClients,它们略有不同:

Pymongo MongoClient:

MongoClient(host=['x.x.x.x:27017'], document_class=dict, tz_aware=False, connect=True)

MongoEngine MongoClient:

MongoClient(host=['x.x.x.x:27017'], document_class=dict, tz_aware=False, connect=True, read_preference=Primary())

read_preference 是否以某种方式影响我的连接能力?

调用代码如下:

user_admin_client = pymongo.MongoClient(
    f'mongodb://{usern}:{pswd}@x.x.x.x/my_db'
)
print(user_admin_client)

user_admin_client = mongoengine.connect(db='my_db',
                                        username=usern,
                                        password=pswd,
                                        host='x.x.x.x',
                                        alias='init'
                                                )
print(user_admin_client)

如何让 MongoEngine 工作?我在这里做错了什么?

------ 2019 年 5 月 9 日更新:

我尝试了以下代码:

user_admin_client = mongoengine.connect(
        f'mongodb://{usern}:{pswd}@x.x.x.x/my_db'
        )
    print(user_admin_client)

我得到以下信息:

MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True, read_preference=Primary())
...traceback...
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [WinError 10061] No connection could be made because the target machine actively refused it

我对为什么 MongoClient 现在尝试连接到本地主机感到有点困惑,因为我的 IP 地址肯定是正确输入的。即使使用 x.x.x.x:port 也没有做任何事情。

我不认为你做错了什么。

能否尝试使用 Mongo URI 本身通过 MongoEngine 进行连接。

类似于:

user_admin_client = mongoengine.connect('mongodb://{usern}:{pswd}@x.x.x.x/my_db')
print(user_admin_client)

您需要在连接上使用 host 参数

user_admin_client = mongoengine.connect(host='mongodb://{usern}:{pswd}@x.x.x.x/my_db')