Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНастройка и подключение

Python requests: trust_env и почему сессия игнорирует настройки

scrapy_boy
scrapy_boy
Участник
сообщений 530
с окт
1 мая, 08:52первое сообщение

Полдня убил на ерунду, оставлю тут, чтобы другие не убивали.

Есть сессия, в ней прописан посредник. Запрос уходит мимо него, в ответе мой домашний адрес. Прописываю то же самое прямо в get, всё едет как надо.

import requests
s = requests.Session()
s.proxies = {"https": "http://login:pass@198.51.100.20:8080"}
print(s.get("https://api.ipify.org").text)   # мой адрес
print(requests.get("https://api.ipify.org",
                   proxies=s.proxies).text)  # адрес туннеля

Сессия что, хранит поле для красоты?

nastroyka_pro
nastroyka_pro
Ветеран
сообщений 2110
с мар
8 октября, 11:09#2

Поле рабочее, просто у него слабый вес.

Перед отправкой библиотека смотрит на переменные окружения и подмешивает их в набор для запроса. Набор запроса стоит выше того, что лежит в сессии. Выходит, что HTTPS_PROXY из окружения перекрывает s.proxies, хотя вы его туда не клали.

Проверьте, что у вас в оболочке:

кто лежит в окружении
кто лежит в окружении
Данила Р
Данила Р
Новичок
сообщений 145
с мар, второй сезон
15 марта, 14:26#3

а если просто вычистить окружение в самом скрипте, os.environ.pop сработает?

scrapy_boy
scrapy_boy
Участник
сообщений 530
с окт
22 августа, 17:43#4
nastroyka_pro: набор запроса стоит выше того, что лежит в сессии

Проверил, ровно так. В окружении висел старый локальный посредник от отладки веб-морды, я про него забыл напрочь. Убрал строки, сессия сразу заработала.

Данила, pop работает, но у меня выключение вышло надёжнее:

s.trust_env = False
dev_null_ru
dev_null_ru
Ветеран
сообщений 2560
с фев
1 января, 08:00#5

Сработает, только сначала прочтите, что вы этим выключаете, иначе через неделю будет второй такой же полдня.

trust_env отвечает не только за посредника. С ним же уходит чтение .netrc, откуда библиотека тянет пару логина с паролем для доменов, и переменная с путём к своему набору корневых сертификатов. Если у вас внутренний сайт с самоподписанным сертификатом жил на этой переменной, после выключения он начнёт падать на проверке, и связь с правкой вы поймаете далеко не сразу.

Отдельная песня на Windows. Там библиотека под капотом смотрит не только окружение, но и системные настройки из реестра, те самые, которые ставит галочка в свойствах обозревателя. Скрипт на такой машине может ходить через посредника, про которого в коде нет ни строчки, и env вам ничего не покажет.

И про NO_PROXY: он читается в обоих регистрах, а вот значения там сравниваются по хвосту имени. Строка вида .local,10.0.0.0/8 работает по домену, но сеть маской она не понимает, адреса придётся перечислять.

Мой порядок такой: trust_env выключаю всегда, посредника задаю явно в сессии, сертификаты передаю параметром verify. Тогда поведение скрипта одинаковое на любой машине.

Лена Соболева
Лена Соболева
Участник
сообщений 385
с дек
8 июня, 11:17#6

Про реестр не знала, спасибо. У нас как раз половина команды на Windows, а прогоны у всех расходятся, теперь понятно куда смотреть.

scrapy_boy
scrapy_boy
Участник
сообщений 530
с окт
15 ноября, 14:34#7

Свёл для себя в три строки: выключить trust_env, посредника в сессию, сертификат параметром. Гоняю на трёх машинах, выдача везде одна.