我正在使用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')
答案 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