之后MongoClient连接失败httpretty.enable()

2024-06-07 11:57:27 发布

您现在位置:Python中文网/ 问答频道 /正文

无论何时启用HTTPretty,我都无法与PyMongo建立连接。我知道HTTPretty改变了核心套接字模块;有什么办法可以解决这个问题吗?在

代码示例:



    import pymongo
    import httpretty
    import time

    httpretty.enable()
    try:
        client = pymongo.MongoClient()
    except pymongo.errors.AutoReconnect:
        print("AutoReconnect")
        time.sleep(2)

引发异常:

^{pr2}$

我在Windows8.1上使用Python3.3。在

有谁能解释一下这种行为以及如何解决它吗?谢谢!在


Tags: 模块代码importclient示例核心timeenable
1条回答
网友
1楼 · 发布于 2024-06-07 11:57:27

看起来这个异常是和HTTPretty的monkey补丁有关的 socket,当我们对非HTTP请求调用sendall时,它在自己的套接字上调用settimeout(0)(请参见 ^{})。这个 将套接字置于非阻塞模式。套接字上的超时永远不会重置 在real_sendall之后,因此对recv的后续调用将失败,并返回{} (错误号10035)。这可能是HTTPretty中的一个bug。在

解决方法之一是在 real_sendall。这可以通过猴子修补fakesocket.socket 在HTTPretty中:

from httpretty.core import fakesock

class MySocket(fakesock.socket):
    def real_sendall(self, data, *args, **kw):
        super(MySocket, self).real_sendall(data, *args, **kw)
        # Restore non-zero timeout
        self.truesock.settimeout(self.timeout)

fakesock.socket = MySocket

相关问题 更多 >

    热门问题