Один быстрый и грязный способ сделать это - установить обезьяну на патч saxutils.prepare_input_source
. Вы можете просто скопировать + вставить его и настроить ветку, которая вызывает urllib.urlopen
, чтобы он получал UrlOpener
из urllib2
с установленным прокси.
К сожалению, я думаю, что это единственный способ получить буквально желаемое поведение без изменения общесистемных настроек или создания собственного EntityResolver
, который может кэшировать результаты.
Проблема в том, что saxutils.prepare_input_source
довольно однозначно делает вызов urllib.urlopen
и не имеет опций для изменения этого поведения. Таким образом, вам придется перенаправить его через прокси-сервер, что повлияет на всех других клиентов urllib
По Магнусу Хоффу: Рабочая реализация исправления обезьян:
def make_caching_prepare_input_source(old_prepare_input_source, proxy):
def caching_prepare_input_source(source, base = None):
if isinstance(source, xmlreader.InputSource):
return source
full_uri = urlparse.urljoin(base or "", source)
if not full_uri.startswith('http:'):
args = (source,) if base == None else (source, base)
return old_prepare_input_source(*args)
r = urllib2.Request(full_uri)
r.set_proxy(proxy, 'http')
f = urllib2.urlopen(r)
i = xmlreader.InputSource()
i.setSystemId(source)
i.setByteStream(f)
return i
return caching_prepare_input_source
def enable_http_proxy(server):
saxutils.prepare_input_source = make_caching_prepare_input_source(
saxutils.prepare_input_source,
server,
)