Requests PreparedRequest и отсутствующие настройки окружения
Согласуйте собственные подготовленные запросы с обычной обработкой прокси и CA в Requests, не считая, что любой низкоуровневый send игнорирует прокси.
Запрос может работать через 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, слияние соблюдает эту политику; оно не навязывает окружение клиенту, который сознательно его отключил.