How to send urlencoded parameters in POST request in python

Set the Content-Type header to application/x-www-form-urlencoded.

headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post(URL, data=params, headers=headers)

Just to an important thing to note is that for nested json data you will need to convert the nested json object to string.

data = { 'key1': 'value',
         'key2': {
                'nested_key1': 'nested_value1',
                'nested_key2': 123
         }

       }

The dictionary needs to be transformed in this format

inner_dictionary = {
                'nested_key1': 'nested_value1',
                'nested_key2': 123
         }


data = { 'key1': 'value',
         'key2': json.dumps(inner_dictionary)

       }

r = requests.post(URL, data = data)

You don't need to explicitly encode it, simply pass a dict.

>>> r = requests.post(URL, data = {'key':'value'})

From the documentation:

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