Python pymongo 3.2:连接失败不工作

Python pymongo 3.2:连接失败不工作,python,pymongo,Python,Pymongo,当代码无法连接到MongoD实例时,我正在竭尽全力让pymongo出错。看起来无论我做什么,“pymongo.errors.ConnectionFailure”都不起作用。我在localhost和远程mongoD实例上尝试过这一点。当我从同一个系统使用mongoclient shell('mongo--host xx.xx.xx.xx')时,我得到了正确的“连接被拒绝”。其他异常正在工作,但不是“ConnectionFailure”。请注意,当我在mongod实例主机上运行tshark snif

当代码无法连接到MongoD实例时,我正在竭尽全力让pymongo出错。看起来无论我做什么,“pymongo.errors.ConnectionFailure”都不起作用。我在localhost和远程mongoD实例上尝试过这一点。当我从同一个系统使用mongoclient shell('mongo--host xx.xx.xx.xx')时,我得到了正确的“连接被拒绝”。其他异常正在工作,但不是“ConnectionFailure”。请注意,当我在mongod实例主机上运行tshark sniffer时,我在关闭端口上看到正确的TCP RST,用于拒绝连接。Mongod未侦听,但pymongo ConnectionFailure无法捕获失败的连接

python版本:2.7.10 pymongo版本:3.2

我可能会遗漏什么,或者需要采取哪些步骤进行故障排除?在下面的示例中,mongod未在本地主机上运行。我还在远程主机上停止它。在这两种情况下,都不会捕获异常错误,pymongo代码似乎认为它已连接

代码:


第一次尝试:语法错误

代码中有语法错误。更改:

pymongo.MongoClient('localhost':27017)
进入:

或者像这样:

pymongo.MongoClient(host='localhost', port=27017)
你的报价单放错地方了


使用Python3.4.3和pymongo 2.9的工作示例代码段

import pymongo

try:
    pymongo.MongoClient('localhost:27017')
except pymongo.errors.ConnectionFailure as e:
    print(e)

阅读后

我认为这种行为符合要求,因为:

在Pymongo3中,MongoClient构造函数不再在 连接到一个或多个服务器,并且不再引发
ConnectionFailure
如果它们不可用,也不
ConfigurationError
如果 用户的凭据错误。相反,构造函数返回 立即启动并在后台线程上启动连接进程。 添加了connect选项以控制这些线程是否 立即启动,或在首次使用客户端时启动

如《迁移指南》所示,类似这样的操作应该可以:


这似乎只有在我再添加两行以获取数据库和身份验证时才起作用。我不知道为什么。ConnectionFailure不应该只在尝试连接时捕获错误吗

try:
    dbconn = pymongo.MongoClient(host, port)
    db = dbconn[dbname]
    success = db.authenticate(user, password)

except pymongo.errors.ConnectionFailure as msg:
    print "Failed connection: %s" % str(msg)
当我在未运行mongod的主机上使用嗅探器观看时,它会尝试连接20-30秒,然后pymongo主机打印:

'连接失败:host.db.com:27017:[Errno 61]连接被拒绝'

def dbConnect():
def dbConnect():
    try:
        conn = pymongo.MongoClient(<connection URL>)
        try:
            conn.server_info()
            return "Connection Successfull"
        except OperationFailure as e:
            return e
    except Exception as e:
        return e

print (dbConnect())
尝试: conn=pymongo.MongoClient() 尝试: 连接服务器信息() 返回“连接成功” 除操作故障外,如e: 返回e 例外情况除外,如e: 返回e 打印(dbConnect())

由于MongoClient不会返回在康涅狄格州有帮助的有价值的响应,这将很好地工作。

在使用
pymongo.MongoClient()时,我也面临这个问题。

请尝试下面的代码,它可能会帮助您:

def initiateDbConnection():
        try:
            dbConnection= pymongo.MongoClient(<connection URL>)
            try:
                dbConnection.server_info()
                return "Connection Established"
            except OperationFailure as err:
                return err
        except Exception as err:
            return err
    print (initiateDbConnection())
def initiateDbConnection():
尝试:
dbConnection=pymongo.MongoClient()
尝试:
dbConnection.server_info()
返回“已建立连接”
除操作故障作为错误外:
返回错误
除异常作为错误外:
返回错误
打印(initiateDbConnection())

您是否能够使用
mongo
shell连接到MongoDB?否,响应被拒绝。因此,首先您应该确保MongoDB正常运行…mongod不应该运行。pymongo代码未捕获ConnectionFailure的异常。我不确定我还能检查什么,因为MongoD不应该运行。我可以让MongoShell和pymongo正常连接。我认为你没有理解我的问题。当它不运行时,代码无法检测到连接故障。我之所以需要这样做,是因为对失败连接进行了详细而细致的检测。该死,这并不能解决问题。但愿如此。唯一的区别是您运行的是Python3.4.3,而我运行的是2.7。你是说你得到了ConnectionFailure响应,还是它确实连接了?我可以在端口27017上连接到正在运行的数据库,并在尝试在端口12345上连接时处理ConnectionFailure。好的,在这里继续,但我仍然不明白。这个代码确实有效。似乎ConnectionFailure只在我将句柄添加到DB并尝试进行身份验证时对我有效。这是有效的:@Albert感谢您的测试。您正在运行什么版本的pymongo和python?我猜你已经做了一次理智的检查,确认我的代码是正确的,一定是其他原因。我的错,你在上面说过。我以为你是另一个用户。我唯一能想到的是尝试使用Python 3.4而不是2.7。如果你看到我的另一个答案,我让它工作,做连接失败,但只有当我得到数据库,并试图验证。
try:
    dbconn = pymongo.MongoClient(host, port)
    db = dbconn[dbname]
    success = db.authenticate(user, password)

except pymongo.errors.ConnectionFailure as msg:
    print "Failed connection: %s" % str(msg)
def dbConnect():
    try:
        conn = pymongo.MongoClient(<connection URL>)
        try:
            conn.server_info()
            return "Connection Successfull"
        except OperationFailure as e:
            return e
    except Exception as e:
        return e

print (dbConnect())
def initiateDbConnection():
        try:
            dbConnection= pymongo.MongoClient(<connection URL>)
            try:
                dbConnection.server_info()
                return "Connection Established"
            except OperationFailure as err:
                return err
        except Exception as err:
            return err
    print (initiateDbConnection())