Кэширование suds-объекта. Проблема с юникодом - PullRequest
2 голосов
/ 24 февраля 2010

Я использую suds https://fedorahosted.org/suds/ для извлечения данных с использованием SOAP. Я хотел бы кэшировать результат (используя memcached), чтобы не перегружать сервер, с которого я получаю данные. Проблема заключается в получении кэшированных данных. Выборка работает нормально, но затем django пытается расшифровать данные (force_unicode) и завершается неудачно со следующим:

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

Это то, что я использую для кэширования результата (где результат = объект suds). Использование cPickle (и попробовал pickle на всякий случай, но безуспешно, ничего удивительного).

Ответ suds в юникоде.

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

Ответы [ 3 ]

2 голосов
/ 25 января 2011

Ответы юзеров не могут быть легко выбраны, потому что они являются динамически генерируемыми классами. Suds использует WSDL для генерации «схемы» для запроса, с которой он динамически создает класс, адаптированный для каждого метода. Когда вы делаете запрос, создается экземпляр этого динамического класса и заполняется информацией об ответе. Для восстановления экземпляра маринованного класса, очевидно, требуется сам класс, и здесь подход suds вызывает проблемы, потому что маринованный не знает об этих динамических классах.

Один из подходов для вас - создание собственных классов для представления информации об ответах. Вы можете заполнить экземпляр этого класса ответом suds, и этот класс будет легко выбрать!

После того, как информация становится маринованной, можно поместить ее в memcached.

1 голос
/ 06 марта 2010

Вы уверены, что memcached поддерживает хранение сложных объектов?

Еще одна вещь, которую следует учитывать, - это то, что SUDS имеет свой собственный встроенный механизм кэширования , но я считаю, что это только для данных WSDL / XSD, поэтому его не нужно перекомпилировать каждый раз ты стартап Я не совсем уверен, однако, и возможно, что это также может быть использовано для хранения результатов.

0 голосов
/ 17 марта 2010

Suds возвращает объект suds.sax.text.Text, который является подклассом строкового объекта Unicode Python. Я думаю, что явное приведение этого объекта к Unicode решит вашу проблему.

#Cache the result 
cache.set(hashstring, unicode(result), 120) 
#Return the cached data
result = cache.get(hashstring) 
if result:
    return result
...