xmlrpclib 客户端请求超时
我正在使用 Python 的 xmlrpclib 向 xml-rpc 服务发出请求。
有没有办法设置客户端超时,这样当服务器不可用时我的请求就不会永远挂起?
我知道我可以使用 socket.setdefaulttimeout()
全局设置套接字超时,但这并不可取。
I am using Python's xmlrpclib to make requests to an xml-rpc service.
Is there a way to set a client timeout, so my requests don't hang forever when the server is not available?
I know I can globally set a socket timeout with socket.setdefaulttimeout()
, but that is not preferable.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
干净的方法是定义和使用自定义传输,例如:
!这仅适用于 python2.7 !
中有一个定义和使用自定义传输的示例文档,尽管它将其用于不同的目的(通过代理访问,而不是设置超时),但此代码基本上受到该示例的启发。
The clean approach is to define and use a custom transport, e.g.:
! this will work only for python2.7 !
There's an example of defining and using a custom transport in the docs, though it's using it for a different purpose (access via a proxy, rather than setting timeouts), this code is basically inspired by that example.
哦,要使其在 python2.6+ 中工作,请执行以下操作:
doh, to make this work in python2.6+ do this:
为什么不:
?
毕竟,
HTTP
和HTTPS
似乎只不过是旧版 Python 版本的兼容性类。Why not:
?
After all,
HTTP
andHTTPS
seem to be no more than compatibility classes for older Python versions.与 python 2.7 兼容的替代实现如下(如果您使用 python 2.6,注释包含您想要的内容):
使用 super-method 将允许底层 2.7 实现保持其 HTTP/1.1 保留- 它定义的活动功能。
需要注意的是,如果您尝试通过 https 连接/地址使用 XML-RPC,请将
xmlrpc.SafeTransport
引用替换为xmlrpc.Transport
,并且,如果您使用 2.6 实现,请使用httplib.HTTPSConnection
。An alternative implementation that would be compatible with python 2.7 would be as follows (with a comment containing what you would want if you're using python 2.6):
Using the super-method would allow the underlying 2.7 implementation to maintain its HTTP/1.1 keep-alive functionality it defines.
A thing to note is that if you're trying to use XML-RPC over an https connection/address, replace
xmlrpc.SafeTransport
references withxmlrpc.Transport
instead, and, if you're using the 2.6 implementation, usehttplib.HTTPSConnection
.如果有人尝试在 Python 3+ 中执行此操作并使用上下文 kwarg(在我的例子中允许连接到自签名 SSL 证书),则以下代码适合我
然后调用:
If anyone is trying to do this in Python 3+ and makes use of the context kwarg (In my case to allow connection to self-signed SSL certs), the following code works for me
And then call with: