我的问题是how can i validate username password for mongodb authentication through pymongo?的规范。
我正在尝试使用PyMongo 3.2.2和包含用户和密码的URL连接到MongoDB实例,如MongoDB Docs中所述。不同的是我使用的密码包含'@'。
起初我只是尝试连接而不会逃避,就像这样:
prefix ='mongodb://'
user ='user:passw_with _ @ _'
suffix ='@ 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()传递部分,如下所示:
prefix ='mongodb://'
user = urllib.quote('user:passw_with _ @ _')
suffix ='@ 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网址的密码部分中转义“@”?
答案 0 :(得分:21)
您应该可以使用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 connection string:
中admin
数据库中创建。 mongod
是127.0.0.1(localhost)mongod
为27001 对于Python 3.x,您可以使用urllib.parse.quote()使用%xx
转义替换密码中的特殊字符。例如:
url.parse.quote("p@ssword")
答案 1 :(得分:4)
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))
答案 2 :(得分:2)
在终端中运行:
python -m pip install pymongo[srv]
python文件:
import pymongo
from pymongo import MongoClient
import urllib.parse
username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus("password")
url = "mongodb+srv://{}:{}@cluster0-0000.mongodb.net/<dbname>?retryWrites=true&w=majority".format(username, password)
# url is just an example (your url will be different)
cluster = MongoClient(url)
db = cluster['Sample']
collection = db['temporary']
答案 3 :(得分:0)
只是信息:
MongoDB、pymongo 和 mongoengine 无法处理密码中的多个符号;
<块引用>Windows 数据库名称限制
/\. "$*<>:|?
Unix 和 Linux 系统的数据库名称限制
/\. "$
https://docs.mongodb.com/manual/reference/limits/#Restrictions-on-Field-Names
包含非法符号时转义不起作用。