Заявка може да работи през session.get() и след пренаписване като PreparedRequest да се провали при проверка на сертификата. Нискоуровневият път send не прави същото сливане на средата като нормалния метод request.

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)

Сливайте с крайния подготвен URL след планираните промени по него. Решенията за прокси и заобикаляне зависят от целта, така че настройки за по-ранен URL може да са грешни за действително изпратената заявка.

Настройката CA лесно се пропуска

При включено нормално доверие към средата сливането разглежда REQUESTS_CA_BUNDLE и резервния CURL_CA_BUNDLE, когато проверката не е изрично презаписана. Директен send с подразбиращия се verify не прави това CA търсене. Изключването на проверката скрива разликата, вместо да предостави желаното хранилище на сертификати.

Session.prepare_request() прилага и подготвителното поведение на сесията. Директното създаване на заявка с Request.prepare() е отделен избор; не очаквайте автоматично прилагане на сесийни бисквитки или друга сесийна подготовка.

Прокситата имат по-конкретно правило

Би било неточно да се каже, че всеки PreparedRequest игнорира прокси променливите на средата. В Requests 2.34.2 send определя подразбиращи се проксита, когато липсва именуваният аргумент proxies. Подаване на proxies={} към send прескача точно този клон за подразбиращи се стойности.

Празният речник, подаден на merge_environment_settings, има друга роля: сливането може да го попълни с приложими маршрути от средата преди предаване на send. Виждането само на празен речник в два откъса пропуска различните методи, които го получават.

В собствен код за изграждане на заявки дръжте подготовката, сливането на средата и изпращането заедно. Когато приложението нарочно използва trust_env=False, сливането спазва тази политика; не налага настройки от средата на клиент, който умишлено ги е изключил.

Подобни статии