Как объединить два коннектора в одну сессию в aiohttp?

Как указать коннекторы TCP и Proxy в параметре connector= при использовании библиотеки aiohttp?
  • 22 января 2024 г. 18:38
Ответы на вопрос 2
В библиотеке `aiohttp`, коннектор определяет транспортное средство (mechanism), которое будет использоваться для выполнения HTTP-запросов. Вы не можете объединить два коннектора (например, TCP и Proxy) непосредственно в одном коннекторе, потому что в каждый момент времени требуется использовать конкретный транспортный механизм для конкретного запроса.

Однако, вы можете использовать коннектор с Proxy для всех запросов, проходящих через прокси, а для всех других использовать обычный TCP-коннектор, просто создавая их независимо и выбирая соответствующий коннектор в зависимости от условий ваших запросов.

Вот пример, как можно использовать TCPConnector и ProxyConnector в aiohttp:

```python
import aiohttp

async def fetch(url, session):
    # Используйте конкретный коннектор в зависимости от условий запроса
    if условие_для_использования_proxy:
        # Используйте сессию с ProxyConnector для запроса через прокси
        proxy_connector = aiohttp.ProxyConnector(proxy="http://yourproxyserver:port")
        async with aiohttp.ClientSession(connector=proxy_connector) as session:
            async with session.get(url) as response:
                return await response.text()
    else:
        # Используйте обычную сессию (TCP) для прямого запроса
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                return await response.text()

# Используйте эту функцию с asyncio для выполнения асинхронных HTTP запросов
```

Заметьте, что в примере выше создаются две разные сессии для разных видов коннекторов. Если вы хотите использовать одну и ту же сессию для отправки запросов либо через прокси, либо непосредственно, вам необходимо уметь переключать коннекторы в рамках сессии, что является нетипичным использованием и может потребовать более сложной логики с контролем за жизненным циклом и валидностью сессии.

Также важно отметить, что использование коннекторов следует контролировать, особенно в асинхронном коде, для избегания утечек ресурсов и корректного закрытия сессии и коннектора после выполнения запросов.
Из гитхаба aiohttp_proxy: 
Т.е. ProxyConnector наследует от TCPConnector и пробрасывает в него все неизвестные kwagrs-параметры.
А раз так, ты можешь попробовать прокинуть ssl_context прямо в ProxyConnector.

Правда, вопрос такой - для чего должен использоваться этот ssl_context? Для коннекта скрипта к прокси, или для коннекта к прокси к сайту? Потому что я сомневаюсь, что второе возможно.
Похожие вопросы