Объект сессии 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",
# }
# }