2016-03-24 25 views
7

Se corro nella shell:MongoLab/PyMongo errore di connessione

mongo ds0219xx.mlab.com:219xx/dbname -u user -p pass 

Funziona e mi permette di connettersi al database e tirare le informazioni. Ma se io sono nel mio applicazione Python (Flask) ed eseguire questo:

import pymongo 

client = pymongo.MongoClient("mongodb://user:[email protected]:219xx/dbname") 

db = client["dbname"] 

db.users.insert_one({ 
    "user1": "hello" 
}) 

Mi dà un:

pymongo.errors.OperationFailure: Authentication failed. 

Sono abbastanza sicuro che è mancato prima che arrivi al insert_one() chiama, ma non ne sono completamente sicuro.

Grazie!

Edit: Su richiesta, ecco il callback completa:

Traceback (most recent call last): 
File "run.py", line 1, in <module> 
from app import app 
File "/Users/Derek/Documents/programming/shenalum/app/__init__.py", line 6, in <module> 
from app import views 
File "/Users/Derek/Documents/programming/shenalum/app/views.py", line 4, in <module> 
from data import get_posts, get_user_info 
File "/Users/Derek/Documents/programming/shenalum/app/data.py", line 9, in <module> 
"user1": "hello" 
File "/usr/local/lib/python2.7/site-packages/pymongo/collection.py", line 622, in insert_one 
with self._socket_for_writes() as sock_info: 
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__ 
return self.gen.next() 
File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 718, in _get_socket 
with server.get_socket(self.__all_credentials) as sock_info: 
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__ 
return self.gen.next() 
File "/usr/local/lib/python2.7/site-packages/pymongo/server.py", line 152, in get_socket 
with self.pool.get_socket(all_credentials, checkout) as sock_info: 
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__ 
return self.gen.next() 
File "/usr/local/lib/python2.7/site-packages/pymongo/pool.py", line 541, in get_socket 
sock_info.check_auth(all_credentials) 
File "/usr/local/lib/python2.7/site-packages/pymongo/pool.py", line 306, in check_auth 
auth.authenticate(credentials, self) 
File "/usr/local/lib/python2.7/site-packages/pymongo/auth.py", line 436, in authenticate 
auth_func(credentials, sock_info) 
File "/usr/local/lib/python2.7/site-packages/pymongo/auth.py", line 416, in _authenticate_default 
return _authenticate_scram_sha1(credentials, sock_info) 
File "/usr/local/lib/python2.7/site-packages/pymongo/auth.py", line 188, in _authenticate_scram_sha1 
res = sock_info.command(source, cmd) 
File "/usr/local/lib/python2.7/site-packages/pymongo/pool.py", line 213, in command 
read_concern) 
File "/usr/local/lib/python2.7/site-packages/pymongo/network.py", line 99, in command 
helpers._check_command_response(response_doc, None, allowable_errors) 
File "/usr/local/lib/python2.7/site-packages/pymongo/helpers.py", line 196, in _check_command_response 
raise OperationFailure(msg % errmsg, code, response) 

pymongo.errors.OperationFailure: Autenticazione non riuscita.

+0

Potresti includere l'intero traceback? In questo modo potremmo essere sicuri che fallisca prima della chiamata 'insert_one (...)'. Sebbene l'errore riguardi auth e ciò probabilmente significherebbe durante la creazione di 'MongClient': P –

+0

ha aggiunto che, grazie –

risposta

15

L'ho capito. Puoi farlo dal file python e funzionerà:

connection = pymongo.MongoClient(ab123456.mlab.com, 123456) 
db = connection[databasename] 
db.authenticate(database_user, database_pass) 
+0

Per favore, per favore, contrassegnalo come corretto. Questa è una gemma :) – Nabin

+0

cosa significa? come quello che stai cercando di trasmettere nella prima riga: pymongo.MongoClient (ab123456.mlab.com, 123456). Il numero di porta appare come secondo argomento? o è la password ma nessun nome utente? non sono sicuro di come interpretare questo – frogeyedpeas

+0

suppongo idealmente che in termini di URL OP fornito e quindi avrà più senso :) – frogeyedpeas

Problemi correlati