Խուսափեք urllib opener-ի գլոբալ փոփոխություններից proxy ստուգիչներում
urllib proxy ստուգումները պահեք իրենց սեփական 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.Երբ երթուղին ստուգմանն է պատկանում, կանչեք այս opener-ի սեփական open մեթոդը։ Օրինակի HTTP վերջնակետը կարող է գալ ձեր ծառայությունից կամ հանրային ստուգումների համար նախատեսված HTTP proxy ցանկից։ Հատվածը ցույց է տալիս պատկանելությունը. այն չի սահմանում նույնականացման կամ առողջության ամբողջական քաղաքականությունը։ Հաշվի հետ կապված ցանկացած handler կապված պահեք նախատեսված client-ին։
urllib.request.install_opener() փոխում է գործընթացի կանխադրվածը, որն օգտագործում են ավելի ուշ module-մակարդակի urlopen() կանչերը։ Այդ պատճառով proxy-ներով անցնող ստուգիչը կարող է թողնել, որ անկապ հարցումներն օգտագործեն իր վերջին վերջնակետը։ Ժամանակավոր տեղադրումը և մաքրման ժամանակ վերականգնումը դեռ թույլ են տալիս զուգահեռ հարցումներին աշխատել ընդհանուր փոփոխության ընթացքում։
socket.setdefaulttimeout() նույն կերպ փոխում է ավելի ուշ ստեղծված socket-ների կանխադրվածները։ Օգտագործեք գործողության մակարդակի ժամկետը, երբ միայն ստուգումը պետք է ստանա այն։
Փակեք ստուգման պատասխանները և արդյունքները պահեք կոնկրետ. HTTP սխալի պատասխանը ինքնաբերաբար մեռած proxy լսող չէ։ Եթե համաժամանակյա urllib ստուգումն օգտագործվում է ասինխրոն ծառայությունում, արգելափակող աշխատանքը տեղափոխեք համապատասխան worker. այդ կատարման որոշումը գլոբալ opener փոփոխությունը մեկուսացված չի դարձնում։
Ստուգումը պետք է վերադարձնի իր դիտարկումը՝ չթողնելով այլ ցանցային քաղաքականություն։ Նրա սեփական client օբյեկտը և սահմանափակ գործողությունը այդ սահմանը դարձնում են բացահայտ։