headers
в ответе сервера.Заголовки/header ответа сервера, т.е. которые сервер отправил обратно, доступны после запроса к серверу, в атрибуте Response.headers
. Эти заголовки, модуль requests
возвращает в виде словаря Python:
>>> import requests >>> resp = requests.get('https://httpbin.org/get') >>> resp.headers # { # 'content-encoding': 'gzip', # 'transfer-encoding': 'chunked', # 'connection': 'close', # 'server': 'nginx/1.0.4', # 'x-runtime': '148ms', # 'etag': '"e1ca502697e5c9317743dc078f67693f"', # 'content-type': 'application/json' # }
НО словарь особенный: он создан только для HTTP-заголовков. Согласно RFC 7230, имена заголовков HTTP не чувствительны к регистру символов.
Таким образом, можно получить доступ к любому заголовку, используя при его написании заглавные буквы:
# при извлечении заголовка 'Content-Type' # используется разный регистр символов >>> resp.headers['Content-Type'] # 'application/json' # при извлечении заголовка 'content-type' # используется только нижний регистр символов >>> resp.headers.get('content-type') # 'application/json'
Заголовки также особенные, т.к. сервер может отправить один и тот же заголовок несколько раз с разными значениями, но запросы объединяют их таким образом, чтобы они могут быть представлены в словаре в рамках одного сопоставления, согласно RFC 7230:
Получатель МОЖЕТ объединить несколько полей заголовка с одним и тем же именем поля в одну пару “field-name: field-value”, не изменяя семантику сообщения, добавляя каждое последующее значение поля к объединенному значению поля по порядку, разделенному запятой.
Если необходимо получить заголовки, которые МЫ отправили серверу, то просто получаем доступ к запросу, а затем к заголовкам запроса:
>>> import requests >>> resp = requests.get('https://httpbin.org/get', headers={'one': 'true'}) >>> resp.request.headers # {'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', # 'Accept': '*/*', 'Connection': 'keep-alive', 'one': 'true'}
headers
на сервер в запросе.Если необходимо добавить в запрос пользовательские HTTP-заголовки, то просто передайте словарь со своими заголовками в аргумент headers
метода requests.get()
.
Например, в предыдущих примерах мы не указывали/устанавливали user-agent
(тип браузера):
>>> import requests >>> url = 'https://api.github.com/some/endpoint' # определение типа агента пользователя >>> headers = {'user-agent': 'my-app/0.0.1'} # передача пользовательского агента, # определенного в словаре аргумента `headers` >>> resp = requests.get(url, headers=headers)
Примечание: Пользовательские заголовки имеют меньший приоритет, чем более конкретные источники информации. Например:
headers
, будут переопределены, если учетные данные указаны в файле .netrc
, который, в свою очередь, будет переопределен аргументом auth
. Модуль requests
будет искать файл netrc
по адресу ~/.netrc
, ~/_netrc
или по пути, указанному переменной среды NETRC
.Content-Length
будут переопределены, когда можно будет определить длину содержимого ответа.Кроме того, запросы вообще не меняют свое поведение в зависимости от того, какие пользовательские заголовки указаны. Заголовки просто передаются в окончательный запрос.
Примечание: Все значения заголовка должны быть текстовой строкой, строкой bytes
или unicode
. Хотя это разрешено, но рекомендуется избегать передачи значений заголовка в unicode
.