HTTPX пошёл через чужой прокси: разбираем trust_env и окружение

Локально клиент обращается к сервису напрямую, а на другой машине получает ошибку подключения к прокси. В коде proxy не задан. Причина может находиться в окружении процесса: HTTPX по умолчанию учитывает настройки прокси и некоторые настройки сертификатов из переменных окружения. Одинаковый исходный файл ещё не означает одинаковый маршрут запроса.

Для клиента с полностью явной сетевой конфигурацией можно поставить trust_env=False. Это отключает использование переменных окружения, поддерживаемых HTTPX. Важно понимать ширину изменения: речь не только о HTTP_PROXY, HTTPS_PROXY и ALL_PROXY, но также о SSL_CERT_FILE и SSL_CERT_DIR. Если корпоративный корневой сертификат был задан только через окружение, его нужно передать другим явным способом.

Сетевая политика процесса

Диагностику начните с окружения именно запущенного процесса. Терминал, IDE и служба могут наследовать разные значения. Не выводите полный URL прокси в общедоступный журнал: он может содержать учётные данные. Для проверки решения достаточно знать наличие переменной и выбранный режим клиента.

import os
import tempfile
from pathlib import Path
from unittest.mock import patch
import httpx

with tempfile.TemporaryDirectory() as directory:
    missing = str(Path(directory) / "missing-ca.pem")
    with patch.dict(os.environ, {"SSL_CERT_FILE": missing}):
        try:
            with httpx.Client(trust_env=True):
                pass
        except OSError:
            pass
        else:
            raise AssertionError("invalid certificate path must be noticed")
        with httpx.Client(trust_env=False) as client:
            assert not client.is_closed
    print("explicit environment policy")

Явная конфигурация клиента

Установите HTTPX командой python -m pip install httpx. Этот файл на Python 3.12 проверяет выбор окружения без сетевого запроса: путь к сертификату намеренно не существует. При trust_env=True создание HTTPS-контекста замечает неправильный SSL_CERT_FILE, при False клиент создаётся. Пример проверен с HTTPX 0.28.1. В прикладном интеграционном тесте дополнительно подтвердите реальный маршрут к контролируемому адресу.

Если прокси нужен, лучше настроить его явно там, где собирается клиент. Тогда настройки приложения показывают, откуда берётся маршрут, а тест может передать собственное значение. Для исключений используется NO_PROXY, но его правила стоит проверить на нужных адресах и доменах. Не исправляйте проблему маршрута отключением проверки TLS: verify=False решает другой вопрос и убирает проверку подлинности сервера.

Для переиспользуемой библиотеки не стоит без объяснения навязывать trust_env=False всем пользователям. Сетевую политику обычно выбирает приложение. Библиотека может принимать готовый Client либо явную настройку создания. Это позволяет запускать тот же код в окружении с обязательным корпоративным прокси и в изолированном процессе.

Добавьте проверку конфигурации к тестам точки сборки клиента. Отдельно проверьте поведение при корректном сертификате, неправильном пути и отключённом доверии окружению. Так причина различия между машинами становится воспроизводимой настройкой. После этого ошибки соединения можно разбирать по адресу и фазе, а не случайно исправлять их изменением переменных в текущем терминале.

Когда локальный пример работает, полезно разобрать соседние механизмы языка и их взаимодействие. В курсе «Python для профессионалов» есть практика по итераторам, генераторам, декораторам, asyncio, метапрограммированию и профилированию. Эти темы помогают понимать время жизни объектов, управление выполнением и причины поведения прикладной программы.

Посмотреть программу и практику курса.

Документация: официальный источник по теме.

Другие задачи по теме: База, HTTP-клиенты и тесты API.

Продолжить на практике

  • Python для профессионалов ↗

    Python для профессионалов — курс для людей, стремящихся углубить свои знания языка. Вы изучите итераторы, генераторы, декораторы, современные возможности Python (3.8+), освоите метапрограммирование, асинхронность, внутреннее устройство интерпретатора, инструменты оптимизации и профилирования, а также получите уверенность в использовании продвинутых возможностей стандартной библиотеки.