2

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

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

这是我用来缓存结果的(其中结果 = suds-object)。使用 cPickle (并尝试了 pickle 以防万一,但没有成功,不足为奇)。

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')
4

3 回答 3

2

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

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

一旦信息可以腌制,就可以将其放入 memcached 中。

于 2011-01-25T11:54:50.440 回答
1

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

另一件需要考虑的事情是,SUDS 内置了自己的缓存机制,但我相信它只针对 WSDL/XSD 数据,因此不必每次启动时都重新编译。然而,我并不完全肯定,它也有可能用于存储结果。

于 2010-03-05T21:14:39.767 回答
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
于 2010-03-16T21:26:04.837 回答