Запрос может работать через 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. Решения о прокси и обходе зависят от назначения, поэтому настройки для прежнего URL могут быть неверны для фактически отправляемого запроса.

Настройку CA легко упустить

При обычном включённом доверии окружению слияние учитывает REQUESTS_CA_BUNDLE и резервный CURL_CA_BUNDLE, если проверка не была явно переопределена. Прямой вызов send со стандартным verify не выполняет этот поиск CA. Отключение проверки скрывает различие вместо предоставления нужного хранилища сертификатов.

Session.prepare_request() также применяет поведение подготовки сессии. Создание запроса напрямую через Request.prepare() — отдельный выбор; не ожидайте автоматического применения cookies сессии или другой сессионной подготовки.

Для прокси действует более конкретное правило

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

Пустой словарь, переданный merge_environment_settings, играет другую роль: слияние может наполнить его подходящими маршрутами окружения перед передачей в send. Рассмотрение только пустого словаря в двух фрагментах упускает разные методы, которые его получают.

В собственном коде построения запросов держите подготовку, слияние окружения и отправку вместе. Если приложение намеренно использует trust_env=False, слияние соблюдает эту политику; оно не навязывает окружение клиенту, который сознательно его отключил.

Похожие статьи