2010-02-24 63 views
2

我使用泡沫https://fedorahosted.org/suds/来使用SOAP获取数据。我想缓存结果(使用memcached)不要从我要提取数据的地方重载服务器。问题是在获取缓存的数据时。获取它工作正常,但随后的Django试图将数据(force_unicode)解码和它失败,出现以下:缓存泡沫对象。 Unicode问题

The string that could not be encoded/decoded was: armv�rmare t 

这是我使用缓存的结果(其中结果=泡对象)。使用cPickle(并尝试过腌制以防万一,但没有成功,不出意外)。

泡沫响应是unicode。

#Cache the result 
cache.set(hashstring, pickle.dumps(result), 120) 
#Return the cached data 
result = cache.get(hashstring) 
if result: 
    return pickle.loads(result, encoding='utf-8') 

回答

2

因为它们是动态生成的类,所以不易腌制酱汁。 Suds使用WSDL为请求生成一个“模式”,用它动态地为每个方法创建一个类。当您提出请求时,将创建此动态类的实例并填充响应信息。恢复一个pickled类的实例显然需要这个类本身,这里是suds的方法导致问题的地方,因为pickle不知道这些动态类。

您的一种方法是创建自己的类来表示响应信息。你可以用suds响应填充这个类的一个实例,这个类将会很容易泡菜!

一旦信息可以使用,应该可以将它放入memcached。

1

您肯定memcached支持存储复杂对象吗?

另一件需要考虑的事情是SUDS有自己的内置caching mechanism,但我相信它只适用于WSDL/XSD数据,所以每次启动时都不需要重新编译它。然而,我并不完全乐观,它也可能用于存储结果。

+0

我不确定memcached支持它,但我也尝试用pickle存储到一个文件,我也遇到了问题。 – xintron 2010-03-06 10:31:59

0

Suds返回一个suds.sax.text.Text对象,它是Python Unicode字符串对象的子类。我认为明确地将该对象转换为Unicode可以解决您的问题。

#Cache the result 
cache.set(hashstring, unicode(result), 120) 
#Return the cached data 
result = cache.get(hashstring) 
if result: 
    return result