【问题标题】:Caching suds-object. Unicode problem缓存 suds 对象。统一码问题
【发布时间】:2010-02-24 09:53:43
【问题描述】:

我正在使用 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(并尝试了 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')

【问题讨论】:

    标签: django memcached pickle suds


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      另外需要考虑的是,SUDS 有自己的caching mechanism 内置,但我相信它只用于 WSDL/XSD 数据,因此不必每次启动时都重新编译。不过,我并不完全肯定,它也有可能用于存储结果。

      【讨论】:

      • 我不确定 memcached 是否支持它,但我也尝试使用 pickle 存储到文件中,但我也遇到了问题。
      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-24
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        相关资源
        最近更新 更多