Requests Python Headers


Quickstart — Requests 2.26.0 documentation

Quickstart — Requests 2.26.0 documentation

Eager to get started? This page gives a good introduction in how to get started
with Requests.
First, make sure that:
Requests is installed
Requests is up-to-date
Let’s get started with some simple examples.
Make a Request¶
Making a request with Requests is very simple.
Begin by importing the Requests module:
Now, let’s try to get a webpage. For this example, let’s get GitHub’s public
>>> r = (”)
Now, we have a Response object called r. We can
get all the information we need from this object.
Requests’ simple API means that all forms of HTTP request are as obvious. For
example, this is how you make an HTTP POST request:
>>> r = (”, data = {‘key’:’value’})
Nice, right? What about the other HTTP request types: PUT, DELETE, HEAD and
OPTIONS? These are all just as simple:
>>> r = requests. options(”)
That’s all well and good, but it’s also only the start of what Requests can
Passing Parameters In URLs¶
You often want to send some sort of data in the URL’s query string. If
you were constructing the URL by hand, this data would be given as key/value
pairs in the URL after a question mark, e. g.
Requests allows you to provide these arguments as a dictionary of strings,
using the params keyword argument. As an example, if you wanted to pass
key1=value1 and key2=value2 to, you would use the
following code:
>>> payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
>>> r = (”, params=payload)
You can see that the URL has been correctly encoded by printing the URL:
>>> print()
Note that any dictionary key whose value is None will not be added to the
URL’s query string.
You can also pass a list of items as a value:
>>> payload = {‘key1’: ‘value1’, ‘key2’: [‘value2’, ‘value3’]}
Response Content¶
We can read the content of the server’s response. Consider the GitHub timeline
>>> import requests
‘[{“repository”:{“open_issues”:0, “url”:”
Requests will automatically decode content from the server. Most unicode
charsets are seamlessly decoded.
When you make a request, Requests makes educated guesses about the encoding of
the response based on the HTTP headers. The text encoding guessed by Requests
is used when you access You can find out what encoding Requests is
using, and change it, using the r. encoding property:
>>> r. encoding
>>> r. encoding = ‘ISO-8859-1’
If you change the encoding, Requests will use the new value of r. encoding
whenever you call You might want to do this in any situation where
you can apply special logic to work out what the encoding of the content will
be. For example, HTML and XML have the ability to specify their encoding in
their body. In situations like this, you should use ntent to find the
encoding, and then set r. encoding. This will let you use with
the correct encoding.
Requests will also use custom encodings in the event that you need them. If
you have created your own encoding and registered it with the codecs
module, you can simply use the codec name as the value of r. encoding and
Requests will handle the decoding for you.
Binary Response Content¶
You can also access the response body as bytes, for non-text requests:
>>> ntent
b'[{“repository”:{“open_issues”:0, “url”:”
The gzip and deflate transfer-encodings are automatically decoded for you.
The br transfer-encoding is automatically decoded for you if a Brotli library
like brotli or brotlicffi is installed.
For example, to create an image from binary data returned by a request, you can
use the following code:
>>> from PIL import Image
>>> from io import BytesIO
>>> i = (BytesIO(ntent))
JSON Response Content¶
There’s also a builtin JSON decoder, in case you’re dealing with JSON data:
>>> ()
[{‘repository’: {‘open_issues’: 0, ‘url’: ‘
In case the JSON decoding fails, () raises an exception. For example, if
the response gets a 204 (No Content), or if the response contains invalid JSON,
attempting () raises requests. exceptions. JSONDecodeError. This wrapper exception
provides interoperability for multiple exceptions that may be thrown by different
python versions and json serialization libraries.
It should be noted that the success of the call to () does not
indicate the success of the response. Some servers may return a JSON object in a
failed response (e. g. error details with HTTP 500). Such JSON will be decoded
and returned. To check that a request is successful, use
r. raise_for_status() or check atus_code is what you expect.
Raw Response Content¶
In the rare case that you’d like to get the raw socket response from the
server, you can access If you want to do this, make sure you set
stream=True in your initial request. Once you do, you can do this:
>>> r = (”, stream=True)

>>> (10)
In general, however, you should use a pattern like this to save what is being
streamed to a file:
with open(filename, ‘wb’) as fd:
for chunk in er_content(chunk_size=128):
Using er_content will handle a lot of what you would otherwise
have to handle when using directly. When streaming a
download, the above is the preferred and recommended way to retrieve the
content. Note that chunk_size can be freely adjusted to a number that
may better fit your use cases.
An important note about using er_content versus
er_content will automatically decode the gzip and deflate
transfer-encodings. is a raw stream of bytes – it does not
transform the response content. If you really need access to the bytes as they
were returned, use
More complicated POST requests¶
Typically, you want to send some form-encoded data — much like an HTML form.
To do this, simply pass a dictionary to the data argument. Your
dictionary of data will automatically be form-encoded when the request is made:
>>> r = (“, data=payload)
“form”: {
“key2”: “value2”,
“key1”: “value1″},… }
The data argument can also have multiple values for each key. This can be
done by making data either a list of tuples or a dictionary with lists
as values. This is particularly useful when the form has multiple elements that
use the same key:
>>> payload_tuples = [(‘key1’, ‘value1’), (‘key1’, ‘value2’)]
>>> r1 = (”, data=payload_tuples)
>>> payload_dict = {‘key1’: [‘value1’, ‘value2’]}
>>> r2 = (”, data=payload_dict)
“key1”: [
“value2″]},… }
>>> ==
There are times that you may want to send data that is not form-encoded. If
you pass in a string instead of a dict, that data will be posted directly.
For example, the GitHub API v3 accepts JSON-Encoded POST/PATCH data:
>>> import json
>>> url = ”
>>> payload = {‘some’: ‘data’}
>>> r = (url, (payload))
Instead of encoding the dict yourself, you can also pass it directly using
the json parameter (added in version 2. 4. 2) and it will be encoded automatically:
>>> r = (url, json=payload)
Note, the json parameter is ignored if either data or files is passed.
Using the json parameter in the request will change the Content-Type in the header to application/json.
POST a Multipart-Encoded File¶
Requests makes it simple to upload Multipart-encoded files:
>>> files = {‘file’: open(”, ‘rb’)}
>>> r = (url, files=files)
“files”: {
“file”: “<>“},… }
You can set the filename, content_type and headers explicitly:
>>> files = {‘file’: (”, open(”, ‘rb’), ‘application/’, {‘Expires’: ‘0’})}
If you want, you can send strings to be received as files:
>>> files = {‘file’: (”, ‘some, data, to, send\nanother, row, to, send\n’)}
“file”: “some, data, to, send\\nanother, row, to, send\\n”},… }
In the event you are posting a very large file as a multipart/form-data
request, you may want to stream the request. By default, requests does not
support this, but there is a separate package which does –
requests-toolbelt. You should read the toolbelt’s documentation for more details about how to use it.
For sending multiple files in one request refer to the advanced
It is strongly recommended that you open files in binary
mode. This is because Requests may attempt to provide
the Content-Length header for you, and if it does this value
will be set to the number of bytes in the file. Errors may occur
if you open the file in text mode.
Response Status Codes¶
We can check the response status code:
>>> atus_code
Requests also comes with a built-in status code lookup object for easy
>>> atus_code ==
If we made a bad request (a 4XX client error or 5XX server error response), we
can raise it with
Response. raise_for_status():
>>> bad_r = (”)
>>> bad_r. raise_for_status()
Traceback (most recent call last):
File “requests/”, line 832, in raise_for_status
raise _error
TPError: 404 Client Error
But, since our status_code for r was 200, when we call
raise_for_status() we get:
>>> r. raise_for_status()
All is well.
If a response contains some Cookies, you can quickly access them:
>>> r = (url)
>>> okies[‘example_cookie_name’]
To send your own cookies to the server, you can use the cookies
>>> cookies = dict(cookies_are=’working’)
>>> r = (url, cookies=cookies)
‘{“cookies”: {“cookies_are”: “working”}}’
Cookies are returned in a RequestsCookieJar,
which acts like a dict but also offers a more complete interface,
suitable for use over multiple domains or paths. Cookie jars can
also be passed in to requests:
>>> jar = questsCookieJar()
>>> (‘tasty_cookie’, ‘yum’, domain=”, path=’/cookies’)
>>> (‘gross_cookie’, ‘blech’, domain=”, path=’/elsewhere’)
>>> r = (url, cookies=jar)
‘{“cookies”: {“tasty_cookie”: “yum”}}’
Redirection and History¶
By default Requests will perform location redirection for all verbs except
We can use the history property of the Response object to track redirection.
The Response. history list contains the
Response objects that were created in order to
complete the request. The list is sorted from the oldest to the most recent
For example, GitHub redirects all HTTP requests to HTTPS:

>>> r. history
If you’re using GET, OPTIONS, POST, PUT, PATCH or DELETE, you can disable
redirection handling with the allow_redirects parameter:
>>> r = (”, allow_redirects=False)
If you’re using HEAD, you can enable redirection as well:
>>> r = (”, allow_redirects=True)
You can tell Requests to stop waiting for a response after a given number of
seconds with the timeout parameter. Nearly all production code should use
this parameter in nearly all requests. Failure to do so can cause your program
to hang indefinitely:
>>> (”, timeout=0. 001)
File ““, line 1, in
requests. Timeout: HTTPConnectionPool(host=”, port=80): Request timed out. (timeout=0. 001)
timeout is not a time limit on the entire response download;
rather, an exception is raised if the server has not issued a
response for timeout seconds (more precisely, if no bytes have been
received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do
not time out.
Errors and Exceptions¶
In the event of a network problem (e. DNS failure, refused connection, etc),
Requests will raise a ConnectionError exception.
Response. raise_for_status() will
raise an HTTPError if the HTTP request
returned an unsuccessful status code.
If a request times out, a Timeout exception is
If a request exceeds the configured number of maximum redirections, a
TooManyRedirects exception is raised.
All exceptions that Requests explicitly raises inherit from
Ready for more? Check out the advanced section.
If you’re on the job market, consider taking this programming quiz. A substantial donation will be made to this project, if you find a job through this platform.
Using headers with the Python requests library's get method

Using headers with the Python requests library’s get method

So I recently stumbled upon this great library for handling HTTP requests in Python; found here
I love working with it, but I can’t figure out how to add headers to my get requests. Help?
asked Jun 7 ’11 at 4:03
According to the API, the headers can all be passed in using
import requests
(“, headers={“content-type”:”text”})
answered Jun 7 ’11 at 4:13
cwallenpoolecwallenpoole73. 8k23 gold badges120 silver badges161 bronze badges
Seems pretty straightforward, according to the docs on the page you linked (emphasis mine).
(url, params=None, headers=None, cookies=None, auth=None,
Sends a GET request.
Returns Response object.
url – URL for the new
Request object.
params – (optional)
Dictionary of GET Parameters to send
with the Request.
headers – (optional)
Dictionary of HTTP Headers to send
cookies – (optional)
CookieJar object to send with the
auth – (optional) AuthObject
to enable Basic HTTP Auth.
timeout –
(optional) Float describing the
timeout of the request.
answered Jun 7 ’11 at 4:12
John FlatnessJohn Flatness29. 7k5 gold badges73 silver badges77 bronze badges
This answer taught me that you can set headers for an entire session:
s = ssion()
= (‘user’, ‘pass’)
s. ({‘x-test’: ‘true’})
# both ‘x-test’ and ‘x-test2’ are sent
(”, headers={‘x-test2’: ‘true’})
Bonus: Sessions also handle cookies.
answered Jun 19 ’17 at 16:30
Cees TimmermanCees Timmerman14. 1k9 gold badges84 silver badges112 bronze badges
Not the answer you’re looking for? Browse other questions tagged python -request python-requests or ask your own question.
Adding or modifying headers on HTTP requests and responses

Adding or modifying headers on HTTP requests and responses

HTTP header fields are components of the header section of request and response messages in the Hypertext Transfer Protocol (HTTP). They define the operating parameters of an HTTP transaction. When you create and configure headers, you can determine how you want your content served to your users. The following steps show you how to add and edit headers.
Log in to the Fastly web interface.
From the All services page, select the appropriate service. You can use the search box to search by ID, name, or domain.
Click the Edit configuration button and then select the option to clone the active version. The Domains page appears.
Click the Content link. The Content page appears.
Click the Create header button. The Create a header window appears.
Fill out the Create a header fields as follows:
In the Name field, enter the name of your header rule (for example, My header).
From the Type menu, select Request, and from the Action menu, select Set.
In the Destination field, enter the name of the header affected by the selected action.
In the Source field, enter where the content for the header comes from.
From the Ignore if set menu, select No if you want the header in the Destination field modified or select Yes if you don’t want it modified.
In the Priority field, enter the order the header rules execute.
The Field description table below provides additional details about each of these controls.
Click the Create button.
Click the Activate button to deploy your configuration changes.
Click the name of the header you want to edit. The Edit this header page appears.
Fill out the Edit this header fields as follows:
Click the Update button.
Field description table
This table describes what each field in the Header window means:
The Name field specifies a memorable word or phrase that allows you to recognize and remember a particular Header rule.
The Type menu can be set to Request, Response, or Cache. Selecting Request modifies the request coming from the user, and this will carry through to the request that gets sent to your origin server. Selecting Response affects the HTTP response that is sent back to the user. Selecting Cache affects the HTTP response that your origin server returns before it gets stored on Fastly servers, meaning whatever changes you make there will be remembered on a cache hit.
The Action menu can be set to Set, Append, Delete, Regex, and Regex All. Selecting Set (the default) will write a value into the header (potentially overwriting it, if it already exists). Selecting Append will add a value onto the end of a header or set it if it doesn’t exist. Selecting Delete will remove a header. When selected, it hides the Source field in the Header window. Selecting Regex allows you to perform a find and replace on specific text and is based on a regular expression you type in. When selected, the Regex and Substitution controls appear in the Header window. Selecting Regex All allows you to perform the same function as Regex but it performs a find and replace multiple times. When selected, the Regex and Substitution controls appear in the Header window.
The Destination field determines the name of the header that is going to be affected by our Action. Because header rules can be used to affect more than just HTTP headers, your input to this field should be formatted like this:
The Source field is available on Set, Append, Regex, and Regex All actions. This field becomes hidden in the Header window when you select Delete from the Action menu. It determines where the new content for the header comes from. There are a plethora of options for Source. The simplest is a static string such as “My Static String” (including the quotes). Other options include,, and See the list of Common Sources below for more common sources of new content.
The Regex field only appears in the Header window when you select Regex or Regex All from the Action menu. It allows you to perform a find and replace on specific text and is based on a regular expression that you type in.
The Substitution field only appears in the Header window when you select the Regex and Regex All from the Action menu. It replaces the text that was removed by the regex expression with the text you typed in the Substitution field.
Ignore if set
By default this is set to No, which means that if the header you are modifying already exists, it will be modified.
The Priority field determines the order in which the header rules execute (e. g., a priority of 1 means the header rule executes first). This can be important if you set headers and then set other headers based on the earlier ones.
Common sources of new content
Valid Types
Request, Cache, Response
The true IP address of the client.
and entity
The client IP address. These variables are available, but may not always display the source IP address. For instance, they may show the edge node IP when shielding is enabled. For the true client IP address, use IMPORTANT: In some cases, client IP data may be considered sensitive. Make sure you protect the sensitive IP data you stream or store.
A unique identifier for the Fastly server processing the request.
The region in which the Fastly server resides.
The data center in which the Fastly server resides.
The URL of the HTTP Request from the client.
The headers from the HTTP Request, access as:
The status returned from the origin server.
The headers from the origin’s HTTP Response, access:
The status that is going to be returned to the client.
The headers in the HTTP Response to be returned to the client, access:
Geolocation values for the client’s IP.

Frequently Asked Questions about requests python headers

How do I send a header request?

Fill out the Create a header fields as follows:In the Name field, enter the name of your header rule (for example, My header ).From the Type menu, select Request, and from the Action menu, select Set.In the Destination field, enter the name of the header affected by the selected action.More items…•Aug 16, 2018

How do you request a header in Python?

Use requests. get() to add headers using requestsheaders_dict = {“Cookie”: “cookie1=value1”}response = requests. get(“”, headers=headers_dict)print(response. content)

What is headers in requests get?

HTTP headers let the client and the server pass additional information with an HTTP request or response. An HTTP header consists of its case-insensitive name followed by a colon ( : ), then by its value. … Response headers hold additional information about the response, like its location or about the server providing it.Aug 18, 2021

About the author


If you 're a SEO / IM geek like us then you'll love our updates and our website. Follow us for the latest news in the world of web automation tools & proxy servers!

By proxyreview

Recent Posts

Useful Tools