2017-11-13 2 views
1

Aufruf Ich versuche, einen Antrag zu stellen, dass mit curl wie folgt aussieht:Attribute: ‚Bool‘ Objekt hat kein Attribut ‚lesen‘, wenn requests.post

curl -X POST \ 
    --header "Authorization: Bearer 48378438…" \ 
    --header "X-Backtory-Storage-Id: 125653265" \ 
    --form fileItems[0][email protected]"/path/to/file1.txt" \ 
    --form fileItems[0].path="/path1/path2/" \ 
    --form fileItems[0].replacing=true \ 
    http://storage.backtory.com/files 

Und mein Code ist so etwas wie folgt aus:

upload_headers = {'Authorization':'Bearer' + ' ' + access_token, 'X-Backtory-Storage-Id':'48378438**********'} 
upload_data = {'fileItems[0].fileToUpload': open('file.txt', 'rb'), 'fileItems[0].path': r'/path1/', 'fileItems[0].replacing': True} 
upload_response = requests.post("http://storage.backtory.com/files", files=upload_data, headers=upload_headers) 
print(upload_r) 

Aber nach diesem Code laufen bekomme ich diesen Fehler:

Traceback (most recent call last): 
    File "backtory-test.py", line 27, in <module> 
    upload_r = requests.post("http://storage.backtory.com/files", files=upload_data, headers=upload_headers) 
    File "C:\Program Files\Python36\lib\site-packages\requests\api.py", line 112, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "C:\Program Files\Python36\lib\site-packages\requests\api.py", line 58, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "C:\Program Files\Python36\lib\site-packages\requests\sessions.py", line 494, in request 
    prep = self.prepare_request(req) 
    File "C:\Program Files\Python36\lib\site-packages\requests\sessions.py", line 437, in prepare_request 
    hooks=merge_hooks(request.hooks, self.hooks), 
    File "C:\Program Files\Python36\lib\site-packages\requests\models.py", line 308, in prepare 
    self.prepare_body(data, files, json) 
    File "C:\Program Files\Python36\lib\site-packages\requests\models.py", line 496, in prepare_body 
    (body, content_type) = self._encode_files(files, data) 
    File "C:\Program Files\Python36\lib\site-packages\requests\models.py", line 159, in _encode_files 
    fdata = fp.read() 
AttributeError: 'bool' object has no attribute 'read' 

welchen Abschnitt meines cod e ist fehlerhaft?

Antwort

0

Jeder Wert im files Wörterbuch muss ein Datei-Deskriptor-ähnliches Objekt sein (dh eine read-Methode haben) oder ein Tupel (siehe unten).

True weder hat eine solche Methode (wie der Fehler sagt) noch ist ein Tupel.

So

upload_data = {'fileItems[0].fileToUpload': open('file.txt', 'rb'), 
       'fileItems[0].path': r'/path1/', 
       'fileItems[0].replacing': True} 

sollte einfach

sein
upload_data = {'filename': open('file.txt', 'rb')} 

Eine weitere Option ein Tupel als Wert zur Verfügung zu stellen. Dadurch können Sie einige Optionen festlegen. Sie können mehr auf requests docs lesen.

path und replacing klingen wie Variablen, die Sie als Daten und nicht als Teil des files Wörterbuchs veröffentlichen sollten.

+0

Danke DeepSpace! Das Problem ist gelöst worden :) –

Verwandte Themen