2016-08-30 18 views
5

私の質問はhow can i validate username password for mongodb authentication through pymongo?の仕様です。pymongo接続のパスワードで@をエスケープする方法は?

MongoDB Docsで説明されているように、私はPyMongo 3.2.2とユーザーとパスワードを含むURLを使用してMongoDBインスタンスに接続しようとしています。違いは、使用しているパスワードに「@」が含まれていることです。まず

私は単にこのように、エスケープせずに接続しようとしました:

prefix = 'mongodb://'

user = 'user:[email protected]_'

suffix = '@127.0.0.1:27001/'

conn = pymongo.MongoClient(prefix + user + suffix)

当然のことながら、私は次のエラーを得た:

InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396. 

だから私は、ユーザーを脱出しようとした:ようurllib.quote()を使用してパーツを渡しますこの:

prefix = 'mongodb://'

user = urllib.quote('user:[email protected]_')

suffix = '@127.0.0.1:27001/'

conn = pymongo.MongoClient(prefix + user + suffix)

しかし、私は:

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 URLのパスワード部分で「@」をエスケープするにはどうすればいいですか?

答えて

11

urllib.quote()を使用してパスワードをエスケープできる必要があります。あなたはパスワードを引用/エスケープするだけで、username:は除外してください。 の場合は、:%3Aにエスケープされます。例えば

import pymongo 
import urllib 

mongo_uri = "mongodb://username:" + urllib.quote("[email protected]") + "@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(ローカルホスト)
  • は、Python 3 27001
+6

であるために割り当てられたポートmongodある: 'urllib.parse.quote' – luckydonald

関連する問題