Python Requests, how to bind to different source ip for each request?
python, python-requests, python-sockets, sockets
Solution
For each request, there is no elegant solution, but you'll need to use a requests Session object and mount a new transport adapter for each request.
You can find example code for the transport adapter in this issue comment, or you can use the adapter included in the `requests-toolbelt` package, like so
import requests
from requests_toolbelt.adapters import source
responses = []
s = requests.Session()
for source_ip, url in list_of_sources_and_urls:
new_source = source.SourceAddressAdapter(source_ip)
s.mount('http://', new_source)
s.mount('https://', new_source)
responses.append(s.get(url))
That assumes that `list_of_sources_and_urls` looks like
[('127.0.0.1', 'https://google.com'),
('255.255.254.0', 'https://yahoo.com'),
# ...
]
Problem
I'm trying to learn some python, and i'm having issues with the logic in what I want to test. Currently my code is written in a way that binding to source_address doesn't change when the process starts ``` import socket import requests real_create_conn = socket.create_connection def set_src_addr(*args): address, timeout = args[0], args[1] source_address = ('201.X.X.1', 0) return real_create_conn(address, timeout, source_address) socket.create_connection = set_src_addr r = requests.get('http://www.mywebpage.com/main') print r.status_code if r.status_code == 404 print "Webpage Down!" r = requests.get('http://www.mywebpage.com/blog') print r.status_code if r.status_code == 204 print "Error occured!" ``` I'm looking to do something like this where ``` import socket import requests While 1: #bind to source address 201.X.X.1 #Send request to main webpage #print result time.sleep(300) # 5 minutes #bind to source address 201.X.X.12 #Send request to blog webpage #print result time.sleep(300) # 5 minutes ```