Как избежать @ в пароле в связи pymongo?

Мой вопрос – это спецификация того, как я могу проверить пароль пользователя для аутентификации mongodb через pymongo? ,

Я пытаюсь подключиться к экземпляру MongoDB с использованием PyMongo 3.2.2 и URL-адреса, который содержит пользователя и пароль, как объяснено в 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 Management Tool ( Robomongo , если это имеет значение), я могу подключиться к MongoDB с использованием (реального) адреса и учетных данных.)

Печать пользовательской переменной в приведенном выше 'user:passw_with_%40_' строку 'user:passw_with_%40_' (то есть «@» стала «% 40»), и согласно википедии это ожидаемое экранирование.

Я даже попытался сбежать из @ с одиночной и двойной обратной косой чертой ( user = 'user:passw_with_\\@_' и user = 'user:passw_with_\@_' ), но те не удались с исключением InvalidURI.

TL; DR;

Мой вопрос: как мне избежать «@» в парольной части URL-адреса MongoDB?

One Solution collect form web for “Как избежать @ в пароле в связи pymongo?”

Вы должны уйти от пароля, используя 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.

Пример, описанный выше в строке соединения URI MongoDB :

  • Пользователь создается в базе данных admin .
  • Хост mongod работает 127.0.0.1 (localhost)
  • Порт- mongod назначен 27001
Python - лучший язык программирования в мире.