Skip to main content

How to Access Request Headers and Query Parameters in Flask

In Flask web applications, you often need to access information sent by the client, such as HTTP headers and query parameters.

This guide explains how to access these values using the request object provided by Flask.

Accessing Request Headers

The request object in Flask (imported from the flask module) provides access to incoming request data. The request.headers attribute is a dictionary-like object that contains the HTTP headers.

The safest and recommended way to access headers is to use the .get() method:

from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def home_route():
print(request.headers) # Prints all headers

auth_header = request.headers.get('Authorization')
content_type = request.headers.get('Content-Type')
accept_header = request.headers.get('Accept')
print('------')
print(auth_header)
print(content_type)
print(accept_header)
return "<p>Home: tutorialreference.com</p>"

if __name__ == '__main__':
app.run(debug=True, host='localhost', port=8000)
  • The code imports the request object from flask, and creates a simple route that handles requests sent to / URI.
  • request.headers.get('Header-Name'): This attempts to retrieve the header named 'Header-Name'. Crucially, if the header is not present in the request, .get() returns None by default (or you can specify a different default value as the second argument).
  • The header names are case-insensitive.

Example request (using curl):

curl -H "Authorization: Bearer mytoken" -H "Content-Type: application/json" -H "Accept: text/html" http://localhost:8000/
  • The -H flags in curl specify request headers.
  • You can use different tools to send HTTP requests, such as curl, Postman or httpie.

The output in your Flask application's console would be (the exact EnvironHeaders output will vary):

EnvironHeaders([('Host', 'localhost:8000'), ('Connection', 'keep-alive'), ('Authorization', 'Bearer mytoken'), ('Content-Type', 'application/json'), ('Accept', 'text/html'), ('User-Agent', 'curl/7.81.0'), ('Sec-Fetch-Mode', 'cors')])
------
Bearer mytoken
application/json
text/html

To specify a default if the header does not exist use second parameter:

    @app.route("/")
def home_route():
# ...
# With a default value
print(request.headers.get('Authorization', 'default value'))
print(request.headers.get('Content-Type', 'default value'))
print(request.headers.get('Accept', 'default value'))

return "<p>Home: tutorialreference.com</p>"
note

If the header is not provided, instead of None, a default value is returned.

Accessing Headers with Bracket Notation (Avoid)

You can also access headers using bracket notation like a dictionary (e.g., request.headers['Authorization']), but this is strongly discouraged:

# ⛔️ AVOID THIS:
# print(request.headers['Authorization']) # Raises KeyError if header is missing
  • This approach will throw a KeyError exception if header is not in the request.
  • Always use .get() to avoid unexpected errors. The only exception is if you're absolutely certain the header will always be present and you want an error if it's missing.

Converting request.headers to a Dictionary

If you want to get the headers in a dictionary, pass the request.headers to the dict() constructor:

# Convert the headers object to a native Python dictionary
print(dict(request.headers))

Accessing Query Parameters

Query parameters (the part of the URL after the ?) are accessed via request.args:

Using request.args.get()

from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def home_route():
page = request.args.get('page') # Get the 'page' parameter
limit = request.args.get('limit', default='10') # Get 'limit', default to '10'
print('page:', page)
print('limit:', limit)

return "<p>Home: tutorialreference.com</p>"

if __name__ == '__main__':
app.run(debug=True, host='localhost', port=8000)
  • request.args is a dictionary.

  • request.args.get('page'): Gets the value of the page parameter. Returns None if page is not in the URL.

  • request.args.get('limit', default='10'): Gets the limit parameter, but returns '10' (as a string!) if limit is not provided.

Example URLs and outputs:

  • http://localhost:8000/?page=5&limit=20: page will be '5', limit will be '20'.

  • http://localhost:8000/?page=5: page will be '5', limit will be '10' (the default).

  • http://localhost:8000/: page will be None, limit will be '10'.

  • Type Conversions: Remember that query parameters are always strings. If you need an integer, use int(request.args.get('page', '0')). Always handle potential ValueError exceptions if you convert to a number:

    try:
    page = int(request.args.get('page', '1')) # Default to page 1
    if page < 1: # Validate values
    page = 1
    except ValueError:
    page = 1