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 можуть бути неправильними для фактично надісланого запиту.
Налаштування 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, злиття дотримується цієї політики; воно не нав’язує оточення клієнту, який свідомо його вимкнув.