Η κλήση του install_opener() δύο φορές δεν προσθέτει το δεύτερο opener στο πρώτο. Αντικαθιστά το προεπιλεγμένο opener του module. Αν ένα αντικείμενο γνωρίζει το proxy και ένα άλλο τη σύνδεση στον ιστότοπο, φτιάξτε ένα opener με τους απαιτούμενους handlers.

import os
from urllib.request import (ProxyHandler, HTTPBasicAuthHandler,
                            HTTPPasswordMgrWithDefaultRealm, build_opener)

passwords = HTTPPasswordMgrWithDefaultRealm()
passwords.add_password(None, 'https://example.com/private/',
                       os.environ['SITE_USER'], os.environ['SITE_PASSWORD'])
opener = build_opener(
    ProxyHandler({'https': 'http://203.0.113.10:8080'}),
    HTTPBasicAuthHandler(passwords),
)
with opener.open('https://example.com/private/report', timeout=10) as response:
    body = response.read()

Το proxy και ο προορισμός είναι παραδείγματα. Για μια δημόσια υπηρεσία που μπορεί να προσεγγιστεί μέσω δημόσιου HTTP proxy, η λίστα HTTP proxy παρέχει υποψήφια endpoints για τον handler δρομολόγησης. Αυτό το opener δρομολογεί το αίτημα HTTPS μέσω του HTTP proxy και χειρίζεται την πρόκληση Basic του προορισμού. Δεν ρυθμίζει έλεγχο ταυτότητας proxy.

Αν και το proxy απαιτεί σύνδεση, επιλέξτε ξεχωριστά μια υποστηριζόμενη διάταξη ελέγχου ταυτότητας proxy. Ένα 407 κατά το CONNECT εμφανίζεται πριν ο προορισμός μπορέσει να εκδώσει τη δική του πρόκληση. Η προσθήκη διαπιστευτηρίων του ιστότοπου στη διαχείριση κωδικών δεν μπορεί να ικανοποιήσει αυτή την προγενέστερη ανταλλαγή.

Η άμεση κλήση του opener.open() κρατά τη διαμόρφωση μαζί με τη λειτουργία. Δεν χρειάζεται να αλλάξετε την προεπιλογή σε επίπεδο module, εκτός αν η εφαρμογή θέλει σκόπιμα όλες οι βολικές κλήσεις να μοιράζονται αυτό το opener.

Σχετικά άρθρα