Mi pregunta es una especificación de cómo puedo validar la contraseña del nombre de usuario para la autenticación mongodb a través de pymongo. .
Estoy tratando de conectarme a una instancia de MongoDB usando PyMongo 3.2.2 y una URL que contiene el usuario y la contraseña, como se explica en MongoDB Docs . La diferencia es que la contraseña que estoy usando contiene una '@'.
Al principio simplemente traté de conectarme sin escapar, así:
prefijo = 'mongodb://'
usuario = 'usuario:contraseña_con_@_'
sufijo = '@127.0.0.1:27001/'
conn = pymongo.MongoClient(prefijo + usuario + sufijo)
Naturalmente, obtuve el siguiente error:
InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396.Así que intenté escapar de la parte del usuario: pase usando urllib.quote () de esta manera:
prefijo = 'mongodb://'
usuario = urllib.quote('usuario:contraseña_con_@_')
sufijo = '@127.0.0.1:27001/'
conn = pymongo.MongoClient(prefijo + usuario + sufijo)
pero luego obtuve un:
OperationFailure: Authentication failed.(Es importante decir que al usar una herramienta de administración GUI MongoDB ( Robomongo , si eso importa) puedo conectarme a MongoDB usando la dirección (real) y las credenciales).
La impresión de la variable de usuario en el código anterior generó una 'user:passw_with_%40_' (es decir, '@' se convirtió en '% 40') y, según wikipedia , ese es el escape esperado.
Incluso intenté escapar de @ con barras invertidas simples y dobles ( user = 'user:passw_with_\\@_' y user = 'user:passw_with_\@_' ), pero fallaron con la excepción InvalidURI.
TL;RD;
Mi pregunta es: ¿Cómo escapo una '@' en la parte de la contraseña de una URL de MongoDB?
Debería poder escapar de la contraseña usando urllib.quote() . Aunque solo debe citar/escapar la contraseña y excluir el nombre de username: ; de lo contrario, : también se escapará a %3A .
Por ejemplo:
import pymongo import urllib mongo_uri = "mongodb://username:" + urllib.quote("p@ssword") + "@127.0.0.1:27001/" client = pymongo.MongoClient(mongo_uri)El fragmento anterior se probó para MongoDB v3.2.x, Python v2.7 y PyMongo v3.2.2.
El ejemplo anterior asumido en la cadena de conexión URI de MongoDB :
admin .mongod en el que se ejecuta es 127.0.0.1 (localhost)mongod asignado es 27001 Para Python 3.x, puede utilizar urllib.parse.quote() para reemplazar caracteres especiales en su contraseña usando el escape %xx . Un ejemplo de lo mismo:
urllib.parse.quote("p@ssword")Python 3.6.5: versión de PyMongo 3.7.0 para conectarse a una instancia de 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))Esta es la única forma en que he logrado conectarme a la instancia de mlab MongoDB sin usar la aplicación hilada de pymongo del matraz, necesitaba crear accesorios para las pruebas unitarias.
Python 3.6.5 - PyMongo 3.7.0 versión 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))ejecutar en la terminal:
python -m pip install pymongo[srv]archivo pitón:
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']