Sto scrivendo del codice per interfacciare con redmine e ho bisogno di caricare alcuni file come parte del processo, ma non sono sicuro di come eseguire una richiesta POST da python contenente un file binario.Dati binari POST Python
sto cercando di imitare i comandi here:
curl --data-binary "@image.png" -H "Content-Type: application/octet-stream" -X POST -u login:password http://redmine/uploads.xml
in Python (di seguito), ma non sembra funzionare. Non sono sicuro che il problema sia in qualche modo correlato alla codifica del file o se qualcosa non va nelle intestazioni.
import urllib2, os
FilePath = "C:\somefolder\somefile.7z"
FileData = open(FilePath, "rb")
length = os.path.getsize(FilePath)
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, 'http://redmine/', 'admin', 'admin')
auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
request = urllib2.Request(r'http://redmine/uploads.xml', FileData)
request.add_header('Content-Length', '%d' % length)
request.add_header('Content-Type', 'application/octet-stream')
try:
response = urllib2.urlopen(request)
print response.read()
except urllib2.HTTPError as e:
error_message = e.read()
print error_message
ho accesso al server e si presenta come un errore di codifica:
...
invalid byte sequence in UTF-8
Line: 1
Position: 624
Last 80 unconsumed characters:
7z¼¯'ÅÐз2^Ôøë4g¸R<süðí6kĤª¶!»=}jcdjSPúá-º#»ÄAtD»H7Ê!æ½]j):
(further down)
Started POST "/uploads.xml" for 192.168.0.117 at 2013-01-16 09:57:49 -0800
Processing by AttachmentsController#upload as XML
WARNING: Can't verify CSRF token authenticity
Current user: anonymous
Filter chain halted as :authorize_global rendered or redirected
Completed 401 Unauthorized in 13ms (ActiveRecord: 3.1ms)
Non ho idea del perché, ma usando il modulo richieste lo stesso codice funziona perfettamente ... Grazie mille. Anche se ora sono molto curioso di sapere perché urllib non funziona ... – Mac