Globale urllib-Opener-Änderungen in Proxy-Prüfern vermeiden
Halten Sie urllib-Proxy-Prüfungen bei ihrem eigenen Opener, statt prozessweite Routing- und Timeout-Standards zu ersetzen.
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.Rufen Sie die eigene open-Methode dieses Openers auf, wenn eine Route zur Prüfung gehört. Der HTTP-Endpunkt des Beispiels kann aus Ihrem Dienst oder aus der HTTP-Proxy-Liste für öffentliche Prüfungen stammen. Das Fragment veranschaulicht die Zuständigkeit; es definiert nicht die vollständige Authentifizierungs- oder Zustandsrichtlinie. Binden Sie kontospezifische Handler an den vorgesehenen Client.
urllib.request.install_opener() ändert den prozessweiten Standard, den spätere urlopen()-Aufrufe auf Modulebene verwenden. Ein Prüfer, der Proxys durchläuft, kann daher unbeteiligte Anfragen mit seinem letzten Endpunkt zurücklassen. Temporäres Installieren und Wiederherstellen beim Aufräumen erlaubt parallelen Anfragen weiterhin, während der gemeinsamen Änderung zu laufen.
socket.setdefaulttimeout() ändert ebenso die Standards für danach erzeugte Sockets. Verwenden Sie das Timeout auf Operationsebene, wenn nur die Prüfung es erhalten soll.
Schließen Sie Prüfantworten und halten Sie deren Ergebnisse konkret: Eine HTTP-Fehlerantwort ist nicht automatisch ein toter Proxy-Listener. Wird eine synchrone urllib-Prüfung in einem asynchronen Dienst verwendet, verlagern Sie blockierende Arbeit in einen geeigneten Worker; diese Ausführungsentscheidung macht die globale Opener-Änderung nicht isoliert.
Eine Prüfung sollte ihre Beobachtung zurückgeben, ohne eine andere Netzwerkrichtlinie zu hinterlassen. Ihr eigenes Client-Objekt und die begrenzte Operation machen diese Grenze explizit.