2009-08-10 9 views
0

Ich versuche, ein mehrteiliges Formular mit httplib, URL ist auf Google App-Engine gehostet, auf Post sagt Methode nicht erlaubt, obwohl der Beitrag mit urllib2 funktioniert. Das vollständige Arbeitsbeispiel ist beigefügt.Multipart Formular Beitrag zu Google App-Engine funktioniert nicht

Meine Frage ist, was ist der Unterschied zwischen beiden ist, warum man arbeitet aber nicht die andere

  1. gibt es ein Problem in meinem mulipart Form Postleitzahl?

  2. oder das Problem ist mit Google App Engine?

  3. oder etwas anderes?


import httplib 
import urllib2, urllib 

# multipart form post using httplib fails, saying 
# 405, 'Method Not Allowed' 
url = "http://mockpublish.appspot.com/publish/api/revision_screen_create" 
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url) 
print host, selector 
h = httplib.HTTP(host) 

h.putrequest('POST', selector) 

BOUNDARY = '----------THE_FORM_BOUNDARY' 
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY 
h.putheader('content-type', content_type) 
h.putheader('User-Agent', 'Python-urllib/2.5,gzip(gfe)') 
content = "" 
L = [] 
L.append('--' + BOUNDARY) 
L.append('Content-Disposition: form-data; name="test"') 
L.append('') 
L.append("xxx") 
L.append('--' + BOUNDARY + '--') 
L.append('') 
content = '\r\n'.join(L) 
h.putheader('content-length', str(len(content))) 
h.endheaders() 
h.send(content) 

print h.getreply() 

# post using urllib2 works 
data = urllib.urlencode({'test':'xxx'}) 
request = urllib2.Request(url) 
f = urllib2.urlopen(request, data) 
output = f.read() 
print output 

Edit: Nach putrequest Wechsel zu beantragen (Vorschlag auf Nick Johnson), funktioniert es

url = "http://mockpublish.appspot.com/publish/api/revision_screen_create" 
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url) 

h = httplib.HTTPConnection(host) 

BOUNDARY = '----------THE_FORM_BOUNDARY' 
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY 

content = "" 
L = [] 
L.append('--' + BOUNDARY) 
L.append('Content-Disposition: form-data; name="test"') 
L.append('') 
L.append("xxx") 
L.append('--' + BOUNDARY + '--') 
L.append('') 
content = '\r\n'.join(L) 
h.request('POST', selector, content,{'content-type':content_type}) 
res = h.getresponse() 
print res.status, res.reason, res.read() 

so nun bleibt die Frage, was der Unterschied zwischen beiden Ansätzen ist und zuerst zuerst zur Arbeit gemacht werden?

+2

Haben Sie versucht, die Anfrage mit httplib mit .request() anstelle von .putrequest() usw. zu senden, die Header als dict? –

+0

eigentlich wollte ich eine Datei mit mehrteiligen Formulardaten senden, kann ich das mit Anfrage tun? –

+0

@Nick es funktioniert !, warum? –

Antwort

0

Nick Johnson's Antwort

Haben Sie versucht, die Anfrage zu senden mit httplib .request mit() anstelle von .putrequest() usw., die Header als dict liefern?

es funktioniert!

Verwandte Themen