Как избежать @ в пароле в соединении 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))