我很确定suds不会缓存我的WSDL和XSD like I expect it to。以下是我知道没有使用缓存对象的方法:
client = Client(url)
我有一个小程序,它创建一个suds客户端,发送一个请求,获取响应,然后结束。我的期望是每次运行程序时,都应该从文件缓存中获取WSDL和XSD文件,而不是从URL中获取。这就是为什么我认为:
client.options.cache.duration
设置为('days', 1)
client.options.cache.location
设置为c:\docume~1\mlin\locals~1\temp\suds
,我看到每次运行程序时都会生成并重新生成缓存文件我是否误解了suds缓存应该如何工作?
答案 0 :(得分:15)
问题出在suds库本身。在cache.py中,尽管ObjectCache.get()
总是获得一个有效的文件指针,但它正在执行pickle.load(fp)
的异常(EOFError)。发生这种情况时,只会再次下载该文件。
以下是事件的顺序:
<强> DocumentReader.open():强>
因此保存新缓存文件并不重要,因为下次运行时会发生同样的事情。所有WSDL和XSD文件都会发生这种情况。
我通过在读取和写入时以二进制模式打开缓存文件来解决该问题。具体来说,我所做的更改是在cache.py:
1)在FileCache.put()
中,更改此行:
f = self.open(fn, 'w')
到
f = self.open(fn, 'wb')
2)在FileCache.getf()
中,更改此行:
return self.open(fn)
到
return self.open(fn, 'rb')
我不知道代码库是否足以知道这些更改是否安全,但 从文件缓存中拉出对象,服务仍然正在运行成功,并加载客户端 从16秒下降到2.5秒 。如果你问我就好多了。
希望这个修复或类似的东西可以回到suds主线。我已经将它发送到suds邮件列表(redhat dot com上的fedora-suds-list)。