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-проксі для публічных праверак. Фрагмент паказвае валоданне; ён не вызначае поўную палітыку аўтэнтыфікацыі ці здароўя. Трымайце любыя handler-ы, спецыфічныя для ўліковага запісу, прымацаванымі да гэтага прызначанага кліента.

urllib.request.install_opener() змяняе працэснае значэнне па змаўчанні, якое выкарыстоўваюць наступныя выклікі urlopen() на ўзроўні модуля. Таму праверка, якая перабірае проксі, можа пакінуць незвязаныя запыты на яе апошняй канчатковай кропцы. Часовая ўстаноўка і аднаўленне пры ачыстцы ўсё яшчэ дазваляюць паралельным запытам выконвацца падчас супольнага змянення.

socket.setdefaulttimeout() аналагічна змяняе значэнні па змаўчанні для sockets, створаных пазней. Выкарыстоўвайце тайм-аўт узроўню аперацыі, калі яго павінна атрымаць толькі праверка.

Закрывайце адказы праверкі і трымайце іх вынікі канкрэтнымі: адказ з памылкай HTTP не азначае аўтаматычна мёртвы слухач проксі. Калі сінхронная праверка urllib выкарыстоўваецца ў асінхронным сэрвісе, перанясіце блакуючую працу ў адпаведны worker; гэта рашэнне аб выкананні не робіць глабальнае змяненне opener ізаляваным.

Праверка павінна вяртаць сваё назіранне, не пакідаючы іншую сеткавую палітыку. Яе ўласны аб'ект кліента і абмежаваная аперацыя робяць гэтую мяжу яўнай.

Падобныя артыкулы