Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueError: Data must not be a string

I am trying to do the following with requests:

data = {'hello', 'goodbye'}
json_data = json.dumps(data)
headers = {
        'Access-Key': self.api_key,
        'Access-Signature': signature,
        'Access-Nonce': nonce,
        'Content-Type': 'application/json',
        'Accept': 'text/plain'
    }
r = requests.post(url, headers=headers, data=json_data, 
                 files={'file': open('/Users/david/Desktop/a.png', 'rb')})

However, I get the following error:

ValueError: Data must not be a string.

Note that if I remove the files parameter, it works as needed. Why won't requests allow me to send a json-encoded string for data if files is included?

Note that if I change data to be just the normal python dictionary (and not a json-encoded string), the above works. So it seems that the issue is that if files is not json-encoded, then data cannot be json-encoded. However, I need to have my data encoded to match a hash signature that's being created by the API.

like image 470
David542 Avatar asked Dec 18 '14 18:12

David542


2 Answers

1.Just remove the line json_data = json.dumps(data) and change in request as data=data.

2.Remove 'Content-Type': 'application/json' inside headers.

This worked for me.

like image 141
Akash Raj Avatar answered Nov 14 '22 13:11

Akash Raj


When you specify your body to a JSON string, you can no longer attach a file since file uploading requires the MIME type multipart/form-data.

You have two options:

  1. Encapsulate your JSON string as part as the form data (something like json => json.dumps(data))
  2. Encode your file in Base64 and transmit it in the JSON request body. This looks like a lot of work though.
like image 8
tyteen4a03 Avatar answered Nov 14 '22 13:11

tyteen4a03