Как избежать @ в пароле в соединении pymongo?
мой вопрос-это спецификация как я могу проверить пароль пользователя для аутентификации mongodb через pymongo?.
Я пытаюсь подключиться к экземпляру MongoDB с помощью PyMongo 3.2.2 и URL-адреса, содержащего пользователя и пароль, как описано в MongoDB Docs. Разница в том, что пароль, который я использую, содержит"@".
сначала я просто пытался подключиться, не убегая, вот так:
префикс = 'mongodb://'
user = ' user: 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 () такой:
префикс = ' mongodb://'
user = urllib.цитата ('user:passw_with_@_')
суффикс = '@127.0.0.1:27001/'
conn = pymongo.MongoClient (префикс + пользователь + суффикс)
но потом я нашел:
OperationFailure: Authentication failed.
(важно сказать, что с помощью инструмента управления GUI MongoDB (Robomongo, если это имеет значение) я могу подключиться к MongoDB, используя (реальный) адрес и учетные данные.)
печать пользовательской переменной в приведенном выше коде сгенерировала 'user:passw_with_%40_'
String (то есть ' @ 'стал' %40') и в соответствии с Википедия это ожидаемое бегство.
Я даже пытался избежать @ с одиночными и двойными косыми чертами (user = 'user:passw_with_@_'
и user = 'user:passw_with_@_'
), но они не удалось с исключением InvalidURI.
TL; DR;
мой вопрос: как мне избежать " @ " в части пароля URL-адреса MongoDB?
2 ответов
вы должны быть в состоянии защитить пароль с помощью 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.х, питона версии 2.7, и PyMongo В3.2.2.
выше примере в строка подключения URI MongoDB:
- пользователь создается в
версия Python 3.6.5 - PyMongo 3.7.0 для подключения к mlab например:
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))
Это единственный способ, которым мне удалось подключиться к экземпляру mlab MongoDB без использования приложения flask-pymongo spun up, мне нужно было создать светильники для модульных тестов.
Python 3.6.5-PyMongo 3.7.0 localhost версия:
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))