Pyyntö voi toimia session.get()-kutsulla ja epäonnistua varmenteen tarkistuksessa, kun se kirjoitetaan PreparedRequest-muotoon. Matalan tason send-polku ei tee samaa ympäristön yhdistämistä kuin tavallinen request-metodi.

import requests

with requests.Session() as session:
    request = requests.Request("GET", "https://example.com/")
    prepared = session.prepare_request(request)

    settings = session.merge_environment_settings(
        prepared.url, {}, None, None, None
    )
    response = session.send(
        prepared,
        timeout=(5, 15),
        **settings,
    )
    response.raise_for_status()
    print(response.status_code)

Yhdistä käyttäen lopullista valmisteltua URL:ää kaikkien aiottujen URL-muutosten jälkeen. Välityspalvelin- ja ohituspäätökset riippuvat kohteesta, joten vanhalle URL:lle haetut asetukset voivat olla vääriä oikeasti lähetettävälle pyynnölle.

CA-asetus jää helposti huomaamatta

Kun tavallinen ympäristöluottamus on käytössä, yhdistäminen huomioi REQUESTS_CA_BUNDLE-muuttujan ja sen varan CURL_CA_BUNDLE, jos tarkistusta ei ole nimenomaisesti ohitettu. Suora send-kutsu oletus-verify-asetuksella ei tee tätä CA-hakua. Tarkistuksen poistaminen käytöstä peittää eron eikä anna tarkoitettua varmennevarastoa.

Session.prepare_request() soveltaa myös istunnon valmistelukäyttäytymistä. Pyynnön luominen suoraan Request.prepare()-kutsulla on eri valinta; älä odota istuntoevästeiden tai muun istuntovalmistelun automaattista soveltamista.

Välityspalvelimilla on tarkempi sääntö

Olisi väärin sanoa, että jokainen PreparedRequest ohittaa välityspalvelimen ympäristömuuttujat. Requests 2.34.2:ssa send selvittää oletusvälityspalvelimet, kun proxies-avainsana-argumentti puuttuu. proxies={}-arvon antaminen sendille ohittaa juuri tämän oletusten selvityshaaran.

merge_environment_settings-kutsulle annetulla tyhjällä sanakirjalla on eri rooli: yhdistäminen voi täyttää sen sopivilla ympäristöreiteillä ennen sendille välittämistä. Pelkkä tyhjän sanakirjan näkeminen kahdessa esimerkissä sivuuttaa eri vastaanottavat metodit.

Pidä omassa pyyntörakennuskoodissa valmistelu, ympäristön yhdistäminen ja lähetys yhdessä. Kun sovellus käyttää tarkoituksella trust_env=False-asetusta, yhdistäminen noudattaa sitä; se ei pakota ympäristöasetuksia asiakkaaseen, joka tarkoituksella poisti ne käytöstä.

Aiheeseen liittyvät artikkelit