2015-07-18 14 views
5

Udacity'nin Tam Stack Foundations kursundan bir egzersiz yapmaya çalışıyorum. Temelde ben çok parçalı form ile gönderilen message adında bir post değeri elde etmek istiyoruz, BaseHTTPRequestHandler benim alt sınıf içindeki do_POST yöntemine sahip, bu yöntem için kodu şöyledir:cgi.parse_multipart işlevi, TypeError'ı Python 3'e atar

def do_POST(self): 
    try: 
     if self.path.endswith("/Hello"): 
      self.send_response(200) 
      self.send_header('Content-type', 'text/html') 
      self.end_headers 
      ctype, pdict = cgi.parse_header(self.headers['content-type']) 
      if ctype == 'multipart/form-data': 
       fields = cgi.parse_multipart(self.rfile, pdict) 
       messagecontent = fields.get('message') 
      output = "" 
      output += "<html><body>" 
      output += "<h2>Ok, how about this?</h2>" 
      output += "<h1>{}</h1>".format(messagecontent) 
      output += "<form method='POST' enctype='multipart/form-data' action='/Hello'>" 
      output += "<h2>What would you like to say?</h2>" 
      output += "<input name='message' type='text'/><br/><input type='submit' value='Submit'/>" 
      output += "</form></body></html>" 
      self.wfile.write(output.encode('utf-8')) 
      print(output) 
      return 
    except: 
     self.send_error(404, "{}".format(sys.exc_info()[0])) 
     print(sys.exc_info() ) 

sorun cgi.parse_multipart(self.rfile, pdict) atma olmasıdır Bir istisna: TypeError: can't concat bytes to str, uygulama kurs için videolarda sağlandı, ancak Python 2.7 kullanıyorlar ve python 3 kullanıyorum, bütün öğleden sonra bir çözüm aradım ama yararlı bir şey bulamadım. python 3'te bir multipart formdan geçirilen verileri okumak için doğru yol ol?

cevap

9

Buradaki gibi aynı sorunu çözmek için buraya rastladım. Bunun için aptalca bir çözüm buldum. Sadece 'sınır' öğesini sözlükte bir kodlama seçeneğiyle dizgiden dizgeye dönüştürüyorum.

ctype, pdict = cgi.parse_header(self.headers['content-type']) 
    pdict['boundary'] = bytes(pdict['boundary'], "utf-8") 
    if ctype == 'multipart/form-data': 
      fields = cgi.parse_multipart(self.rfile, pdict) 

Benim durumumda, düzgün çalışıyor gibi görünüyor.

+1

str(boundary) için kullanımını değiştirme '. Bununla nasıl başa çıkılır? –

+0

@AmitBadhekaPykihStaff aşağıdaki io ​​içe aktarma işlemini BytesIO'dan gerçekleştirmeye çalışabilir ve sonra da 'cgi.parse_multipart (BytesIO (yourcontent), pdict) ' – CarlJ

0

Başka bir hack çözümü, cgi modülünün kaynağını düzenlemek. (226 hat civarında) parse_multipart çok başında

: Bu, başka bir hata, ` 'bayt' nesne hiçbir özellik 'readline' vardır bana verir boundary

... 
boundary = b"" 
if 'boundary' in pdict: 
    boundary = pdict['boundary'] 
if not valid_boundary(boundary): 
    raise ValueError('Invalid boundary in multipart form: %r' 
         % (boundary,)) 

nextpart = b"--" + str(boundary) 
lastpart = b"--" + str(boundary) + b"--" 
... 
İlgili konular