Why might I be getting 400 on this request?

ES 8.6.2.

Low-level user here. I'm trying to clone and then delete in order to rename an index.
Before cloning I'm told (here) I should execute this "index.blocks.write" command.

This is my attempt (Python):

        ES_URL = 'https://localhost:9500' # yes, running on that Port
        TEMP_INDEX_NAME = 'temp_index'
        data = {
            'settings': {
              'index.blocks.write': True,
            }            
        }
        headers = {'Content-type': 'application/json'}
        # NB the auth and verify stuff is definitely working
        requests.put(f'{ES_URL}/{TEMP_INDEX_NAME}/_settings', data=data, headers=headers, auth=auth, verify=verify)

... gets 400 "Bad Request"

And in fact, if I omit that, and just try for the clone, I also get 400:

    requests.post(f'{ES_URL}/{TEMP_INDEX_NAME}/_clone/my_new_index', auth=auth, verify=verify)

Is there maybe something I need to enable in the configuration of ES?

The payload is wrong, there is no top-level settings and also there is a comma after True, but you do not have another item. [check the documentation].

You may try with one of these payloads:

        data = {
            'index': {
              'blocks.write': true
            }            
        }
        data = {
              'index.blocks.write': true
        }

Thanks very much. This is very puzzling. I tried various permutations of what you suggested. true (lower-case "t") on its own doesn't work in Python: it is illegal. But I tried with the string "true".

Also, in Python, a dictionary (dict) takes no account of a trailing comma after the last key-value pair.

But I tried with both True and string "true" with both your suggestions. And I'm still getting 400.

PS I also checked out that documentation page you linked to. But it's quite general, not covering "blocks.write" stuff.

I found the solution. In fact this command (as suggested by leandrojmp) worked fine when I ran it in Insomnia... but not when I use Python code. Checking various questions on this at Stack Overflow I found the solution:

    data = json.dumps({
        'index': {
            'blocks.write': True
        }
    })

... i.e. submitting the dict didn't work. Submitting a string of the dict does. This is extremely surprising as I've been using dict directly since... years! (and have never encountered this issue before ever, to my knowledge).