我的问题是我如何通过pymongo验证mongodb身份验证的用户名密码的规范?。
我正在尝试使用PyMongo 3.2.2和包含用户名和密码的URL连接到MongoDB实例,如MongoDB Docs中所述。所不同的是,我使用的密码包含一个“ @”。
刚开始,我只是尝试不逃避地连接,就像这样:
前缀='mongodb://'
用户='用户:passw_with _ @ _'
后缀='@ 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://'
用户= urllib.quote('user:passw_with _ @ _')
后缀='@ 127.0.0.1:27001 /'
conn = pymongo.MongoClient(前缀+用户+后缀)
但后来我得到了:
OperationFailure: Authentication failed.
(重要的是,使用GUI MongoDB管理工具(Robomongo,如果重要的话),我可以使用(真实)地址和凭据连接到MongoDB。)
在上面的代码中打印用户变量会生成一个'user:passw_with_%40_'
字符串(即'@'变为'%40'),并且根据Wikipedia的预期,这是可以避免的。
我什至尝试使用单反斜杠(user = 'user:passw_with_\\@_'
和user = 'user:passw_with_\@_'
)来转义@ ,但是由于InvalidURI异常而失败。
TL; DR;
我的问题是:如何在MongoDB URL的密码部分中转义“ @”?
您应该可以使用来转义密码urllib.quote()
。尽管您只应引用/转义密码,并排除username:
; 否则:
遗嘱也将被逃脱%3A
。
例如:
import pymongo
import urllib
mongo_uri = "mongodb://username:" + urllib.quote("p@ssword") + "@127.0.0.1:27001/"
client = pymongo.MongoClient(mongo_uri)
上面的代码段已针对MongoDB v3.2.x,Python v2.7和PyMongo v3.2.2进行了测试。
上面的示例在MongoDB URI连接字符串中假设:
admin
数据库中创建用户。mongod
运行的主机是127.0.0.1(localhost)mongod
分配给的端口是27001对于Python 3.x,可以使用urllib.parse.quote()来使用%xx
转义符替换密码中的特殊字符。例如:
url.parse.quote("p@ssword")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句