2010-01-23 3 views
18

Konwertuję aplikację Python2.6 do aplikacji Python3 i utknąłem z serwerem. Udało mi się sprawić, że serwowanie żądań GET było w porządku, ale POST wciąż mnie unika. Oto, co zacząłem w 2.6, które działało, ale w 3.x normalny serwer nie obsługuje żądań POST. Z mojego czytania podręcznika Pythona wynika, że ​​muszę zamiast tego używać klasy serwera CGI, a także mapować skrypty do tego katalogu. Wolałbym nie robić tego, ale nie mogę znaleźć innej drogi. Czy czegoś brakuje?Python3 http.server POST przykład

def do_POST(self): 
    ctype, pdict = cgi.parse_header(self.headers.get('content-type')) 
    if ctype == 'multipart/form-data': 
     query = cgi.parse_multipart(self.rfile, pdict) 

    self.send_response(301) 

    self.end_headers() 
    upfilecontent = query.get('upfile') 
    print("filecontent", upfilecontent[0]) 
    self.wfile.write("<HTML>POST OK.<BR><BR>"); 
    self.wfile.write(upfilecontent[0]); 
+0

W jaki sposób normalny serwer nie obsługuje postów w Pythonie 3, tak jak w Pythonie 2? Czy możesz wyjaśnić, na czym polega problem? –

+0

Tak, to nie będzie implikować funkcji do_post(), podczas gdy będzie to funkcja z Python2. Nie ma przykładów solidnego kodu, jak go pokonać w dokumentacji Pythona, a Google Googling też nie pomógł. – Teifion

Odpowiedz

15

Po szturchaniu i kilku godzinach szukania, znalazłem następujące prace.

def do_POST(self): 
    length = int(self.headers['Content-Length']) 
    post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8')) 
    # You now have a dictionary of the post data 

    self.wfile.write("Lorem Ipsum".encode("utf-8")) 

Jestem zaskoczony, jak łatwo było to zrobić.