我使用优秀的 python 请求库为 rest API 编写了一个非常简单的客户端。一切都很好 util 我通过负载均衡器运行客户端,它会理智地检测空闲的 tcp 连接并杀死它们。我希望我的客户端使用一些不同于我平台 (linux) 上的默认设置的 tcp 保持事件选项。但是我没有看到任何简单的方法来告诉套接字库我想为新套接字选择一些默认选项。
当直接使用 socket.create_connection 时,使用装饰器很容易做到这一点,但我不知道当实际调用被埋在某些第 3 方库中时,我如何使装饰调用可用,就像请求。
提前致谢
最佳答案
较新版本的 urllib3
(从 1.8.3 开始,2014 年 6 月 23 日发布)支持设置套接字选项。
您可以通过创建自定义适配器从 requests
(自 2.4.0 起,2014 年 8 月 29 日发布)设置这些选项:
class HTTPAdapterWithSocketOptions(requests.adapters.HTTPAdapter):
def __init__(self, *args, **kwargs):
self.socket_options = kwargs.pop("socket_options", None)
super(HTTPAdapterWithSocketOptions, self).__init__(*args, **kwargs)
def init_poolmanager(self, *args, **kwargs):
if self.socket_options is not None:
kwargs["socket_options"] = self.socket_options
super(HTTPAdapterWithSocketOptions, self).init_poolmanager(*args, **kwargs)
然后您可以将此适配器挂载到需要自定义套接字选项的 session (例如设置SO_KEEPALIVE
):
adapter = HTTPAdapterWithSocketOptions(socket_options=[(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)])
s = requests.session()
s.mount("http://", adapter)
s.mount("https://", adapter)
关于python - 是否可以覆盖请求中的默认套接字选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148225/