Suds не использует повторно кэшированные WSDL и XSD, хотя я ожидаю, что

Я почти уверен, что suds не кэширует мои WSDL и XSD, как я ожидаю. Вот как я знаю, что кэшированные объекты не используются:

  1. Создание клиента занимает около 30 секунд: client = Client(url)
  2. Записи регистратора показывают последовательное усвоение файлов XSD и WSDL в течение всех 30 секунд.
  3. Wireshark показывает согласованный трафик TCP на сервер, хранящий файлы XSD и WSDL в течение всех 30 секунд.
  4. Я вижу, что файлы в кэше обновляются каждый раз, когда я запускаю свою программу

У меня есть небольшая программа, которая создает клиента suds, отправляет один запрос, получает ответ, а затем завершается. Я ожидаю, что каждый раз, когда я запускаю программу, она должна извлекать файлы WSDL и XSD из файлового кэша, а не из URL-адресов. Вот почему я думаю, что:

  1. client.options.cache.duration установлен в ('days', 1)
  2. client.options.cache.location установлен в c:\docume~1\mlin\locals~1\temp\suds и я вижу, что файлы кэша генерируются и перегенерируются каждый раз, когда я запускаю программу
  3. На мгновение я подумал, что, возможно, кэш не используется повторно между запусками программы, но я не думаю, что в этом случае будет использоваться файловый кеш, потому что кэш в памяти будет работать нормально

Я неправильно понимаю, как кэширование пены должно работать?

1 ответ

Решение

Проблема в самой библиотеке suds. В cache.py, хотя ObjectCache.get() всегда получает действительный указатель файла, он выполняет исключение (EOFError), делая pickle.load(fp), Когда это происходит, файл просто загружается снова.

Вот последовательность событий:

DocumentReader.open ():

  1. Попытка http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdl
  2. Загрузка ObjectCache 51012453-документа
  3. Загрузка маринованного объекта...
  4. Возникло исключение:
  5. Нет из кеша
  6. Загрузка... Готово
  7. Сохранение FileCache 51012453-документа... Готово

Так что на самом деле не имеет значения, что новый файл кэша был сохранен, потому что то же самое происходит при следующем запуске. Это происходит для ВСЕХ файлов WSDL и XSD.

Я исправил эту проблему, открыв файл кэша в двоичном режиме при чтении и записи. В частности, изменения, которые я сделал, были в cache.py:

1) В FileCache.put() измените эту строку:

f = self.open(fn, 'w')

в

f = self.open(fn, 'wb')

2) В FileCache.getf() измените эту строку:

return self.open(fn)

в

return self.open(fn, 'rb')

Я не знаю кодовую базу достаточно хорошо, чтобы знать, безопасны ли эти изменения, но он извлекает объекты из файлового кэша, служба все еще работает успешно, и загрузка клиента продолжалась с 16 до 2,5 секунд. Намного лучше, если вы спросите меня.

Надеюсь, это исправление или что-то подобное может быть введено обратно в основную строку suds. Я уже отправил это в список рассылки suds (fedora-suds-list на redhat dot com).

Другие вопросы по тегам