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.

Crideu el mètode open propi d'aquest opener quan una ruta pertanyi a la prova. El punt final HTTP de l'exemple pot venir del vostre servei o de la llista de proxy HTTP per a proves públiques. El fragment il·lustra la propietat; no defineix la política completa d'autenticació ni de salut. Manteniu qualsevol gestor específic del compte adjunt a aquest client previst.

urllib.request.install_opener() canvia el valor per defecte de tot el procés que utilitzen les crides posteriors a urlopen() a nivell de mòdul. Per tant, un comprovador que recorre proxies pot deixar que peticions no relacionades utilitzin el seu darrer punt final. Instal·lar temporalment i restaurar en la neteja encara permet que les peticions concurrents s'executin durant la mutació compartida.

socket.setdefaulttimeout() també canvia els valors per defecte dels sockets creats després. Utilitzeu el temps d'espera a nivell d'operació quan només la prova l'hagi de rebre.

Tanqueu les respostes de la prova i manteniu els resultats concrets: una resposta d'error HTTP no és automàticament un oient de proxy mort. Si una prova urllib síncrona s'utilitza en un servei asíncron, moveu la feina bloquejant a un treballador adequat; aquesta decisió d'execució no fa que la mutació global de l'opener sigui aïllada.

Una prova hauria de retornar la seva observació sense deixar una altra política de xarxa al darrere. El seu propi objecte client i l'operació limitada fan explícita aquesta frontera.

Articles relacionats