2

私はsudshttps : //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を試しましたが、成功しませんでした)。

泡の応答はユニコードです。

#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を使用して、各メソッドに合わせたクラスを動的に作成するリクエストの「スキーマ」を生成します。リクエストを行うと、この動的クラスのインスタンスが作成され、レスポンス情報が入力されます。pickledクラスインスタンスを復元するには、明らかにクラス自体が必要です。pickleはこれらの動的クラスを認識していないため、sudsのアプローチで問題が発生します。

応答情報を表す独自のクラスを作成することもできます。このクラスのインスタンスにsuds応答を入力すると、このクラスを簡単に選択できます。

情報がピクルス可能になったら、それをmemcachedに入れても問題ありません。

于 2011-01-25T11:54:50.440 に答える
1

memcachedが複雑なオブジェクトのストレージをサポートしていることを確信していますか?

もう1つ考慮すべき点は、SUDSには独自のキャッシュメカニズムが組み込まれていることですが、これはWSDL / XSDデータ専用であるため、起動するたびに再コンパイルする必要はありません。しかし、私は完全に肯定的ではありません。結果の保存にも使用できる可能性があります。

于 2010-03-05T21:14:39.767 に答える
0

Sudsは、PythonUnicodesuds.sax.text.Text文字列オブジェクトのサブクラスであるオブジェクトを返します。そのオブジェクトを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 に答える