如何在 pymongo 连接的密码中转义 @?

新手上路,请多包涵

我的问题是关于 如何通过 pymongo 验证用户名密码以进行 mongodb 身份验证的规范? .

我正在尝试使用 PyMongo 3.2.2 和包含用户和密码的 URL 连接到 MongoDB 实例,如 MongoDB Docs 中所述。不同之处在于我使用的密码包含一个“@”。

起初我只是简单地尝试连接而不逃避,就像这样:

前缀 = ‘mongodb://’

user = ‘user:passwwith@_’

后缀 = ‘@127.0.0.1:27001/’

conn = pymongo.MongoClient(前缀+用户+后缀)

自然地,我收到以下错误:

 InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396.

所以我尝试使用 urllib.quote() 转义 user:pass 部分,如下所示:

前缀 = ‘mongodb://’

user = urllib.quote(‘user:passwwith@_’)

后缀 = ‘@127.0.0.1:27001/’

conn = pymongo.MongoClient(前缀+用户+后缀)

但后来我得到了一个:

 OperationFailure: Authentication failed.

(重要的是,使用 GUI MongoDB 管理工具( Robomongo ,如果重要的话)我能够使用(真实)地址和凭据连接到 MongoDB。)

在上面的代码中打印用户变量生成了一个 'user:passw_with_%40_' 字符串(即“@”变成了“%40”),根据 维基百科,这是预期的转义。

我什至尝试使用单反斜杠和双反斜杠( user = 'user:passw_with_\\@_'user = 'user:passw_with_\@_' )转义 @,但这些都因 InvalidURI 异常而失败。

长话短说;博士;

我的问题是:如何在 MongoDB URL 的密码部分转义“@”?

原文由 gmauch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 974
2 个回答

您应该能够使用 urllib.quote() 转义密码。尽管您应该只引用/转义密码,并排除 username: ;否则 : 也将转义为 %3A

例如:

 import pymongo
import urllib

mongo_uri = "mongodb://username:" + urllib.parse.quote("p@ssword") + "@127.0.0.1:27001/"
client = pymongo.MongoClient(mongo_uri)

上面的代码片段针对 MongoDB v3.2.x 和 PyMongo v3.2.2 进行了测试。

上面的示例假定在 MongoDB URI 连接字符串 中:

  • 用户在 admin 数据库中创建。
  • 运行的主机 mongod 是 127.0.0.1 (localhost)
  • 分配给的端口 mongod 是27001

原文由 Wan B. 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python 3.6.5 - 用于连接到 mlab 实例的 PyMongo 3.7.0 版本:

 from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@ds00000.mlab.com:000000/recipe_app_testing' % (username, password))

这是我在不使用 flask-pymongo 启动应用程序的情况下设法连接到 mlab MongoDB 实例的唯一方法,我需要为单元测试创建固定装置。

Python 3.6.5 - PyMongo 3.7.0 本地主机版本:

 from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@127.0.0.1:27001/' % (username, password))

原文由 Conor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题