Укажите интерфейс (или IP-адрес источника) для запроса

#python-3.x #aiohttp

#python-3.x #aiohttp

Вопрос:

На моем компьютере есть 2 сетевых интерфейса.

Я хочу использовать aiohttp для HTTP-запросов, но с контролем над тем, через какой из 2 интерфейсов проходит запрос. Это эквивалентно возможности указать мой исходный IP-адрес, поскольку они находятся в разных локальных сетях.

Вот решение, использующее неасинхронный requests модуль:

 import requests

def session_for_src_addr(addr: str) -> requests.Session:
    session = requests.Session()
    for prefix in ('http://', 'https://'):
        session.get_adapter(prefix).init_poolmanager(
            # those are default values from HTTPAdapter's constructor
            connections=requests.adapters.DEFAULT_POOLSIZE,
            maxsize=requests.adapters.DEFAULT_POOLSIZE,
            # This should be a tuple of (address, port). Port 0 means auto-selection.
            source_address=(addr, 0),
        )

    return session

# usage example:
s = session_for_src_addr('192.168.1.12')
s.get('https://httpbin.org/ip')
 

Любой способ добиться аналогичного с aiohttp.ClientSession() помощью?

Комментарии:

1. У меня такая же проблема, пожалуйста, сообщите нам, если вы нашли какое-либо решение. Если решение все еще не существует, единственная возможность выполнять запросы в разных потоках без aiohttp. Но, похоже, это слишком сложное решение для такой «легкой» задачи.

2. Насколько я нашел только этот способ — укажите исходный IP, docs.aiohttp.org/en/v3.7.4.post0/faq.html#id8 Но иногда (как в моем случае) может быть несколько интерфейсов с одним и тем же IP-адресом. Например, если мы подключаемся к нескольким точкам доступа Wi-Fi с одинаковыми настройками по умолчанию или если мы подключаемся к нескольким камерам GoPro. Так что этот способ для меня неприемлем.