ТЛ; др
Данные proxies
не являются частью запроса, отправляемого на удаленный сервер.
Как работает функция requests.get
...
requests
удобно оборачивает нижестоящие библиотеки. Внутри он использует urllib3
, который использует http.client
, который использует socket
. Все дело в отправке и получении байтов через сетевой сокет.
В конечном итоге requests
создает объект PreparedRequest
. Этот объект запроса, соотв. данные в его атрибутах отправляются через сокет INET, которым управляет urllib3.connection.HTTPConnection
, класс, производный от http.client.HTTPConnection
. Это соединение управляется urllib3.connectionpool.ConnectionPool
, который управляется urllib3.poolmanager.Poolmanager
, который является частью requests.adapters.HTTPAdapter
. На этот HTTPAdapter
есть ссылка в requests.sessions.Session
, который создается и используется с requests.api.get()
по requests.api.request()
.
... и какую информацию он отправляет в окончательный API?
Параметры, указанные в вызове requests.get
, используются для создания запроса, который вы хотите отправить, и / или для соединения, через которое этот запрос отправляется.
Параметры, заканчивающиеся в запросе: method
, url
, headers
, files
, data
, json
, params
, auth
и cookies
.
Параметры, такие как verify
, timeout
или proxies
, используются исключительно для установления и управления соединениями и не отображаются в запросе.
Чтобы показать, что отправлено, вот маленькая, глупая и совершенно непригодная для чего-либо удаленная конечная точка сокета:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 42424))
s.listen(1)
while True:
conn, addr = s.accept()
with conn:
data = conn.recv(1024)
print(data.decode())
И наш клиент:
import requests
params = {'foo': 'bar'}
requests.get("http://127.0.0.1:42424", params=params)
«Сервер» печатает:
GET /?foo=bar HTTP/1.1
Host: 127.0.0.1:42424
User-Agent: python-requests/2.18.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Помещение очень простого прокси между этими двумя ...
from socketserver import ThreadingTCPServer
import urllib.request
from http.server import SimpleHTTPRequestHandler
class Proxy(SimpleHTTPRequestHandler):
def do_GET(self):
self.copyfile(urllib.request.urlopen(self.path), self.wfile)
httpd = ThreadingTCPServer(('', 42425), Proxy)
httpd.serve_forever()
(Этот рецепт был явно украден (и откорректирован для Python 3) у Фредрика Лунда на effbot.org )
... и использование proxies
на requests.get
вызове ...
params = {'foo': 'bar'}
proxies = {'http': '127.0.0.1:42425'}
requests.get("http://127.0.0.1:42424", params=params, proxies=proxies)
... приводит к тому, что сервер получает следующее:
GET /?foo=bar HTTP/1.1
Accept-Encoding: identity
Host: 127.0.0.1:42424
User-Agent: Python-urllib/3.6
Connection: close
Таким образом, учетные данные, указанные в proxies
, хранятся между прокси-сервером и вашим клиентом.