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

gmauch:

我的问题是我如何通过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的密码部分中转义“ @”?

Wan Bachtiar:

您应该可以使用来转义密码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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章