我的问题是how can i validate username password for mongodb authentication through pymongo?的规格.

我正在try 使用PyMongo 3.2.2和包含用户和密码的URL连接到MongoDB实例,如MongoDB Docs中所述.区别在于我使用的密码包含一个"@".

一开始,我只是试着在不逃跑的情况下连接,就像这样:

前缀='mongodb://'

user='user:passw_with_@'

后缀="@127.0.0.1:27001/"

康涅狄格州=pymongo.MongoClient(前缀+用户+后缀)

很自然,我犯了以下错误:

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

所以我试着避开用户:使用urllib.quote()传递部分,如下所示:

前缀='mongodb://'

user=urllib.引号('user:passw_with_@u')

后缀="@127.0.0.1:27001/"

康涅狄格州=pymongo.MongoClient(前缀+用户+后缀)

但后来我得到了一个:

OperationFailure: Authentication failed.

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

在上面的代码中打印用户变量生成了'user:passw_with_%40_'字符串(即"@"变成了"%40"),根据wikipedia,这是预期的转义.

我甚至try 用单反斜杠和双反斜杠(user = 'user:passw_with_\\@_'user = 'user:passw_with_\@_')逃离@,但那些都失败了,出现了InvalidURI异常.

TL;DR;

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

推荐答案

你应该可以使用urllib.quote()来逃出密码.尽管你应该只引用/转义密码,并排除username:

例如:

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 connection string年前假设的:

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

For Python 3.x, you can utilise urllib.parse.quote() to replace special characters in your password using the %xx escape. 例如:

url.parse.quote("p@ssword")

Mongodb相关问答推荐

更新查询mongoose 中的礼宾更新字段

在一个视图中连接两个集合MongoDB;展开有什么作用?

MongoDB(Mongoose)条件判断没有像我预期的那样工作

如何在MongoDB中使用Aggregation来计算两个键相同但字段不同的对象数组的总值,并将其合并为一个?

如何将以下聚合查询转换为 bson 并在 golang 中执行

Raft Vs MongoDB 初选

为什么使用整数作为 pymongo 的键不起作用?

MongoDB 更改流副本集限制

无法使用机器 ip 连接到 mongodb

具有最佳插入/秒性能的数据库?

如何在 MongoDB 集合中查找与给定条件匹配的文档和单个子文档

通过 Spring Boot 应用程序访问 mongodb 时的身份验证错误

为什么不建议在 MongoDB 中使用服务器端存储函数?

$elemMatch 的 MongoDB 索引

ZonedDateTime 与 MongoDB

mongo - 如何查询嵌套的 json

如何获取 Mongoid 文档的所有字段名称?

Mongoimport json 文件更新或覆盖..?

我如何使用 Twitter 的流 api 中的推文并将它们存储在 mongodb 中

查询不等于 null 或空的地方