Объект сессии requests.Session
позволяет сохранять определенные параметры в запросах к одному и тому же сайту. Он также сохраняет файлы cookie
во всех запросах, сделанных из экземпляра Session
, и будет использовать пул соединений модуля urllib3
. Поэтому, если делать несколько запросов к одному и тому же хосту, базовое TCP-соединение будет использоваться повторно, что приводит к значительному увеличению производительности.
Объект сессии Session
имеет все методы основного API модуля requests
.
import requests sess = requests.Session() sess.get('https://httpbin.org/cookies/set/sessioncookie/123456789') resp = sess.get('https://httpbin.org/cookies') print(resp.text) # '{"cookies": {"sessioncookie": "123456789"}}'
Сессии/сеансы также могут использоваться для предоставления данных по умолчанию методам запроса. Это делается путем предоставления данных в свойства объекта Session
:
import requests sess = requests.Session() # установленные таким образом данные , будут передаваться # в каждый запрос к сайту в рамках жизни одной сессии sess.headers.update({'x-test': 'true'}) # посылаются как "x-test", так и "x-test2" resp = sess.get('https://httpbin.org/headers', headers={'x-test2': 'true'}) >>> print(resp.text) # { # "headers": { # ... # "X-Test": "true", # "X-Test2": "true" # } # }
Любые словари, которые передаются методу запроса sess.get()
, sess.post()
и т.д., будут объединены с установленными значениями уровня сессии/сеанса. Параметры уровня метода sess.get()
переопределяют параметры сессии/сеанса sess.headers
. Другими словами, если например установить в sess.headers.update({'one': 'true'})
, а потом передать параметр 'one'
с другим значением в метод sess.get(..., headers={'one': 'false'})
, то на сайт попадет последний заголовок, т.е. 'one': 'false'
.
import requests sess = requests.Session() sess.headers.update({'one': 'true'}) # переопределяем заголовок в только этом запросе 'one' на 'false' resp = sess.get('https://httpbin.org/headers', headers={'one': 'false'}) >>> print(resp.text) # { # "headers": { # ... # "One": "false", # } # }
Обратите внимание, что параметры переданные напрямую в методы sess.get()
, sess.post()
и т.д. не будут сохраняться в запросах, даже если используется объект Session
. Этот пример будет отправлять файлы cookie
только с первым запросом, но не со вторым:
import requests sess = requests.Session() resp = sess.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'}) print(resp.text) # '{"cookies": {"from-my": "browser"}}' # файл cookie больше не передается, что бы закрепить # cookie в сессии используйте `sess.cookies.update()` resp = sess.get('https://httpbin.org/cookies') print(resp.text) # '{"cookies": {}}'
Если необходимо вручную добавить ранее сохраненные файлы cookie
в сессию/сеанс, то для управления Session.cookies
используйте функцию requests.utils.add_dict_to_cookiejar(cj, cookie_dict)
, где cj
- это экземпляр requests.cookies.RequestsCookieJar()
, а cookie_dict
это словарь ключ/значения для вставки в cj
.
Сеансы/сессии также можно использовать в качестве контекстных менеджеров:
with requests.Session() as sess: sess.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
Это гарантирует, что сеанс будет закрыт сразу же после выхода из блока with
, даже если произошли необработанные исключения.
Примечание: Иногда надо опустить некоторые ключи, добавленные в сеанс/сессию как постоянные. Чтобы сделать это, необходимо установить значение этого ключа равным None
в аргументе метода запроса, и он будет автоматически опущен.
import requests sess = requests.Session() # установленные таким образом данные , будут передаваться # в каждый запрос к сайту в рамках жизни одной сессии sess.headers.update({'one': 'true', 'two': 'true'}) # отключаем заголовок 'one' только в данном запросе resp = sess.get('https://httpbin.org/headers', headers={'one': None}) >>> print(resp.text) # { # "headers": { # ... # "Two": "true", # } # }