我正在使用泡沫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(并尝试了pickle以防万一,但没有成功,这并不奇怪)。
泡沫响应采用 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')
最佳答案
Suds 响应无法轻松 pickle ,因为它们是动态生成的类。 Suds 使用 WSDL 为请求生成一个“架构”,通过该架构动态创建为每个方法量身定制的类。当您发出请求时,将创建此动态类的一个实例并用响应信息填充。恢复 pickled 类实例显然需要类本身,这就是 suds 的方法导致问题的地方,因为 pickle 不知道这些动态类。
一种方法是创建您自己的类来表示响应信息。您可以使用 suds 响应填充此类的实例,并且此类将很容易 pickle !
一旦信息可以pickle,就可以将其放入memcached中。
关于django - 缓存泡沫对象。统一码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325024/