Suds не использует повторно кэшированные WSDL и XSD, хотя я ожидаю, что
Я почти уверен, что suds не кэширует мои WSDL и XSD, как я ожидаю. Вот как я знаю, что кэшированные объекты не используются:
- Создание клиента занимает около 30 секунд:
client = Client(url)
- Записи регистратора показывают последовательное усвоение файлов XSD и WSDL в течение всех 30 секунд.
- Wireshark показывает согласованный трафик TCP на сервер, хранящий файлы XSD и WSDL в течение всех 30 секунд.
- Я вижу, что файлы в кэше обновляются каждый раз, когда я запускаю свою программу
У меня есть небольшая программа, которая создает клиента suds, отправляет один запрос, получает ответ, а затем завершается. Я ожидаю, что каждый раз, когда я запускаю программу, она должна извлекать файлы WSDL и XSD из файлового кэша, а не из URL-адресов. Вот почему я думаю, что:
client.options.cache.duration
установлен в('days', 1)
client.options.cache.location
установлен вc:\docume~1\mlin\locals~1\temp\suds
и я вижу, что файлы кэша генерируются и перегенерируются каждый раз, когда я запускаю программу- На мгновение я подумал, что, возможно, кэш не используется повторно между запусками программы, но я не думаю, что в этом случае будет использоваться файловый кеш, потому что кэш в памяти будет работать нормально
Я неправильно понимаю, как кэширование пены должно работать?
1 ответ
Проблема в самой библиотеке suds. В cache.py, хотя ObjectCache.get()
всегда получает действительный указатель файла, он выполняет исключение (EOFError), делая pickle.load(fp)
, Когда это происходит, файл просто загружается снова.
Вот последовательность событий:
DocumentReader.open ():
- Попытка http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdl
- Загрузка ObjectCache 51012453-документа
- Загрузка маринованного объекта...
- Возникло исключение:
- Нет из кеша
- Загрузка... Готово
- Сохранение 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).