requests
не имеет официальных хуков для этой задачи. Но вы можете подкласс requests.Session
обернуть метод, который вызывается для каждого перенаправления: Session.rebuild_auth()
:
При перенаправлении мы можем захотеть удалить аутентификация из запроса, чтобы избежать утечки учетных данных. Этот метод интеллектуально удаляет и повторно применяет аутентификацию, где это возможно, чтобы избежать потери учетных данных.
Поскольку он вызывается со следующим (подготовленным) запросом, а также с предыдущим ответом, который инициировал перенаправление, он идеально расположен для добавьте заголовок Referer:
import requests
class RefererSession(requests.Session):
def rebuild_auth(self, prepared_request, response):
super().rebuild_auth(prepared_request, response)
prepared_request.headers["Referer"] = response.url
, затем используйте этот подкласс для всех запросов:
with RefererSession() as session:
r = session.post('http://www.somewebsite.com', allow_redirects=True)
Демонстрация с использованием https://httpbin.org
:
>>> import requests
>>> import http.client
>>> http.client.HTTPConnection.debuglevel = 1
>>> def echo_request_lines(msg, *rest):
... """HTTPConnection debug print handler, writes out request lines"""
... if msg != 'send:': return
... request_lines = literal_eval(rest[0]).replace(b'\r', b'')
... print(request_lines.rstrip().decode('latin1'))
... print()
...
>>> http.client.HTTPConnection.debuglevel = 1
>>> http.client.print = echo_request_lines
>>> class RefererSession(requests.Session):
... def rebuild_auth(self, prepared_request, response):
... super().rebuild_auth(prepared_request, response)
... prepared_request.headers["Referer"] = response.url
...
>>> with RefererSession() as session:
... r = session.get('https://httpbin.org/redirect/2')
...
GET /redirect/2 HTTP/1.1
Host: httpbin.org
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
GET /relative-redirect/1 HTTP/1.1
Host: httpbin.org
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Referer: https://httpbin.org/redirect/2
GET /get HTTP/1.1
Host: httpbin.org
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Referer: https://httpbin.org/relative-redirect/1
>>> from pprint import pprint
>>> pprint(dict(r.history[1].request.headers))
{'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive',
'Referer': 'https://httpbin.org/redirect/2',
'User-Agent': 'python-requests/2.22.0'}
>>> pprint(dict(r.request.headers))
{'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive',
'Referer': 'https://httpbin.org/relative-redirect/1',
'User-Agent': 'python-requests/2.22.0'}