Избегнувајте глобални промени на urllib opener во проверувачите на прокси
Држете ги urllib проверките на прокси локални за нивниот opener наместо да ги заменувате процесните стандардни поставки за рутирање и временски ограничувања.
from urllib.request import ProxyHandler, build_opener
def make_proxy_opener(proxy_uri):
return build_opener(ProxyHandler({
"http": proxy_uri,
"https": proxy_uri,
}))
opener = make_proxy_opener("http://proxy.example.net:8080")
# Use opener.open(destination, timeout=10) for this route.Повикајте го сопствениот метод open на овој opener кога рутата ѝ припаѓа на проверката. HTTP крајната точка од примерот може да доаѓа од вашата услуга или од списокот со HTTP прокси за јавни проверки. Фрагментот илустрира сопственост; тој не ја дефинира целосната политика за автентикација или здравје. Држете ги сите ракувачи специфични за сметката прикачени на предвидениот клиент.
urllib.request.install_opener() ја менува процесната стандардна вредност што ја користат подоцнежните повици urlopen() на ниво на модул. Затоа проверувач што поминува низ проксија може да остави неповрзани барања да го користат неговиот последен крај. Привремената инсталација и враќањето при чистење сè уште им дозволуваат на паралелните барања да работат за време на заедничката промена.
socket.setdefaulttimeout() слично ги менува стандардните вредности за сокети создадени подоцна. Користете го временското ограничување на ниво на операција кога само проверката треба да го добие.
Затворете ги одговорите на проверката и држете ги резултатите конкретни: одговор со HTTP грешка не е автоматски мртов слушател на прокси. Ако синхрона urllib проверка се користи во асинхрона услуга, преместете ја блокирачката работа кај соодветен worker; таа одлука за извршување не ја прави глобалната промена на opener изолирана.
Проверката треба да го врати своето набљудување без да остави друга мрежна политика зад себе. Сопствениот клиентски објект и ограничената операција ја прават таа граница експлицитна.