2016-10-31 37 views
5

Mam zainstalowany mongodb i włączone uwierzytelnianie. i jego działa znaleźć. mogę połączyć ją z notebookiem za pomocą zdalnej aplikacji robomongo:Autoryzacja pymongo nie powiodła się w pythonie

Host: SERVER_IP 
PORT: 27017 
DATEBASE: prod-db 
USERNAME: user_name 
PASS: user_password 
Auth Mechanism: MONGODB-CR 

i możemy połączyć z serwerem skorupy lokalnie przy użyciu:

$ mongo prod-db -u user_name -p user_password 

Wszystko działa poprawnie, ale kiedy próbujemy go za pomocą pymongo API. uwierzytelnienia nie powiodło się. Poniżej znajduje się kod Pythona:

from pymongo import MongoClient 

client = MongoClient() 
client.prod_db.authenticate('user_name', 'user_password', mechanism='MONGODB-CR') 
db = client.prod_db 
result = db.users.find() 

for document in result: 
    print(document) 

Narzędzia używane: śladowe

python 2.7 
pymongo versiob 3.3.1 
MongoDB shell version: 2.6.10 
$ mongod --version 
db version v2.6.10 
2016-10-31T16:34:59.868+0000 git version: nogitversion 
2016-10-31T16:34:59.868+0000 OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016 

Błąd:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 1018, in authenticate 
    connect=True) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 444, in _cache_credentials 
    sock_info.authenticate(credentials) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 343, in authenticate 
    auth.authenticate(credentials, self) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 464, in authenticate 
    auth_func(credentials, sock_info) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/auth.py", line 439, in _authenticate_mongo_cr 
    sock_info.command(source, query) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 239, in command 
    read_concern) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/network.py", line 102, in command 
    helpers._check_command_response(response_doc, None, allowable_errors) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 205, in _check_command_response 
    raise OperationFailure(msg % errmsg, code, response) 

Rozwiązanie: problem był z nazwy bazy danych, po kod działa poprawnie:

from pymongo import MongoClient 

client = MongoClient('mongodb://user_name:[email protected]:27017/prod-db') 
db = client['prod-db'] 

result = db.users.find() 
for document in result: 
    print document 

Odpowiedz

13

Spróbuj coś takiego:

client = MongoClient("mongodb://user_name:[email protected]_IP/prod-db") 
db = client['prod-db'] 
+0

Sprawdź również https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html więcej szczegółów – grubjesic

+0

tak, ale client.prod -db nie działa. klient ['prod-db'] działa dobrze. – sharafjaffri

+0

dokonaj tej zmiany, więc mogę oznaczyć ją zaakceptowaną. – sharafjaffri

Powiązane problemy