缓存suds-object。 Unicode问题

时间:2010-02-24 09:53:44

标签: django memcached pickle suds

我正在使用suds https://fedorahosted.org/suds/来使用SOAP获取数据。我想缓存结果(使用memcached),不要从我获取数据的地方重载服务器。问题是在获取缓存数据时。获取它工作正常,但然后django尝试解码数据(force_unicode),它失败,并带有以下内容:

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

这是我用来缓存结果的地方(其中result = suds-object)。使用cPickle(以及以后尝试过的泡菜,但没有成功,毫不奇怪)。

suds响应是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')

3 个答案:

答案 0 :(得分:2)

因为它们是动态生成的类,因此无法轻易地进行反应。 Suds使用WSDL为请求生成“模式”,通过该模式动态创建为每种方法定制的类。发出请求时,将创建此动态类的实例并使用响应信息填充该实例。恢复一个pickle类实例显然需要类本身,这里suds'方法导致问题,因为pickle不知道这些动态类。

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

一旦信息可以发送,就可以把它放到memcached中。

答案 1 :(得分:1)

你是否肯定memcached支持复杂对象的存储?

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

答案 2 :(得分: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