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.

Chame ao método open propio deste opener cando unha ruta pertenza á comprobación. O punto de conexión HTTP do exemplo pode vir do seu servizo ou da lista de proxy HTTP para comprobacións públicas. O fragmento ilustra a propiedade; non define a política completa de autenticación nin de saúde. Manteña calquera controlador específico da conta vinculado a ese cliente previsto.

urllib.request.install_opener() cambia o valor predeterminado de todo o proceso que usan as chamadas posteriores a urlopen() a nivel de módulo. Por tanto, un comprobador que percorre proxies pode deixar que peticións non relacionadas usen o seu último punto de conexión. Instalar temporalmente e restaurar na limpeza segue permitindo que as peticións simultáneas se executen durante a mutación compartida.

socket.setdefaulttimeout() tamén cambia os valores predeterminados dos sockets creados despois. Use o tempo de espera a nivel de operación cando só a comprobación deba recibilo.

Pecha as respostas da comprobación e mantén os resultados concretos: unha resposta de erro HTTP non é automaticamente un oínte de proxy morto. Se se usa unha comprobación síncrona de urllib nun servizo asíncrono, mova o traballo bloqueante a un traballador axeitado; esa decisión de execución non fai que a mutación global do opener sexa illada.

Unha comprobación debería devolver a súa observación sen deixar outra política de rede detrás. O seu propio obxecto de cliente e a súa operación limitada fan explícita esa fronteira.

Artigos relacionados