无法使用pymongo在远程mongo中执行命令

时间:2016-08-21 06:17:18

标签: python mongodb authentication pymongo

我能够连接到我的远程数据库(当然是在身份验证之后)到数据库。但我无法执行任何命令甚至列表集合。

mongo_url = "blah.com:12345"
db_name = "db_name"
db_user_name = "user"
db_password = "password"
mongo_uri = "mongodb://" + db_user_name + ":" + db_password + "@" + mongo_url + "/" + db_name
connection = pymongo.MongoClient(mongo_uri)
db = connection[db_name]
print db.authenticate(db_user_name, db_password)  // Returns True

但是我无法使用如下命令:     db.collection_names()或使用db.command()

的任何命令

我得到了这个错误堆栈(sayng Authentcation失败):

---------------------------------------------------------------------------
OperationFailure                          Traceback (most recent call last)
<ipython-input-13-1840c0979539> in <module>()
----> 1 db.collection_names()

D:\Continuum\Anaconda2\lib\site-packages\pymongo\database.pyc in collection_names(self, include_system_collections)
    515         """
    516         with self.__client._socket_for_reads(
--> 517                 ReadPreference.PRIMARY) as (sock_info, slave_okay):
    518 
    519             wire_version = sock_info.max_wire_version

D:\Continuum\Anaconda2\lib\contextlib.pyc in __enter__(self)
     15     def __enter__(self):
     16         try:
---> 17             return self.gen.next()
     18         except StopIteration:
     19             raise RuntimeError("generator didn't yield")

D:\Continuum\Anaconda2\lib\site-packages\pymongo\mongo_client.pyc in _socket_for_reads(self, read_preference)
    796         topology = self._get_topology()
    797         single = topology.description.topology_type == TOPOLOGY_TYPE.Single
--> 798         with self._get_socket(read_preference) as sock_info:
    799             slave_ok = (single and not sock_info.is_mongos) or (
    800                 preference != ReadPreference.PRIMARY)

D:\Continuum\Anaconda2\lib\contextlib.pyc in __enter__(self)
     15     def __enter__(self):
     16         try:
---> 17             return self.gen.next()
     18         except StopIteration:
     19             raise RuntimeError("generator didn't yield")

D:\Continuum\Anaconda2\lib\site-packages\pymongo\mongo_client.pyc in _get_socket(self, selector)
    762         server = self._get_topology().select_server(selector)
    763         try:
--> 764             with server.get_socket(self.__all_credentials) as sock_info:
    765                 yield sock_info
    766         except NetworkTimeout:

D:\Continuum\Anaconda2\lib\contextlib.pyc in __enter__(self)
     15     def __enter__(self):
     16         try:
---> 17             return self.gen.next()
     18         except StopIteration:
     19             raise RuntimeError("generator didn't yield")

D:\Continuum\Anaconda2\lib\site-packages\pymongo\server.pyc in get_socket(self, all_credentials, checkout)
    161     @contextlib.contextmanager
    162     def get_socket(self, all_credentials, checkout=False):
--> 163         with self.pool.get_socket(all_credentials, checkout) as sock_info:
    164             yield sock_info
    165 

D:\Continuum\Anaconda2\lib\contextlib.pyc in __enter__(self)
     15     def __enter__(self):
     16         try:
---> 17             return self.gen.next()
     18         except StopIteration:
     19             raise RuntimeError("generator didn't yield")

D:\Continuum\Anaconda2\lib\site-packages\pymongo\pool.pyc in get_socket(self, all_credentials, checkout)
    582         sock_info = self._get_socket_no_auth()
    583         try:
--> 584             sock_info.check_auth(all_credentials)
    585             yield sock_info
    586         except:

D:\Continuum\Anaconda2\lib\site-packages\pymongo\pool.pyc in check_auth(self, all_credentials)
    330 
    331             for credentials in cached - authset:
--> 332                 auth.authenticate(credentials, self)
    333                 self.authset.add(credentials)
    334 

D:\Continuum\Anaconda2\lib\site-packages\pymongo\auth.pyc in authenticate(credentials, sock_info)
    462     mechanism = credentials.mechanism
    463     auth_func = _AUTH_MAP.get(mechanism)
--> 464     auth_func(credentials, sock_info)
    465 
    466 

D:\Continuum\Anaconda2\lib\site-packages\pymongo\auth.pyc in _authenticate_default(credentials, sock_info)
    442 def _authenticate_default(credentials, sock_info):
    443     if sock_info.max_wire_version >= 3:
--> 444         return _authenticate_scram_sha1(credentials, sock_info)
    445     else:
    446         return _authenticate_mongo_cr(credentials, sock_info)

D:\Continuum\Anaconda2\lib\site-packages\pymongo\auth.pyc in _authenticate_scram_sha1(credentials, sock_info)
    226                ('conversationId', res['conversationId']),
    227                ('payload', Binary(client_final))])
--> 228     res = sock_info.command(source, cmd)
    229 
    230     parsed = _parse_scram_response(res['payload'])

D:\Continuum\Anaconda2\lib\site-packages\pymongo\pool.pyc in command(self, dbname, spec, slave_ok, read_preference, codec_options, check, allowable_errors, check_keys, read_concern)
    237                            check, allowable_errors, self.address,
    238                            check_keys, self.listeners, self.max_bson_size,
--> 239                            read_concern)
    240         except OperationFailure:
    241             raise

D:\Continuum\Anaconda2\lib\site-packages\pymongo\network.pyc in command(sock, dbname, spec, slave_ok, is_mongos, read_preference, codec_options, check, allowable_errors, address, check_keys, listeners, max_bson_size, read_concern)
    100         response_doc = unpacked['data'][0]
    101         if check:
--> 102             helpers._check_command_response(response_doc, None, allowable_errors)
    103     except Exception as exc:
    104         if publish:

D:\Continuum\Anaconda2\lib\site-packages\pymongo\helpers.pyc in     _check_command_response(response, msg, allowable_errors)
    203 
    204             msg = msg or "%s"
--> 205             raise OperationFailure(msg % errmsg, code, response)
    206 
    207 

OperationFailure: Authentication failed.

但是我可以从我的mongo shell中执行这些操作。

0 个答案:

没有答案