2016-04-28 6 views
1

Ich versuche, einen einfachen HTTP-Server mit grundlegenden GET-und POST-Funktionalität zu erstellen. Das Programm soll Anfragen erhalten, indem es eine einfache Webseite druckt, die einen Benutzer begrüßt und fragt, wie er lieber begrüßt würde. Wenn der Benutzer eine Begrüßung seiner Wahl eingibt, sollte die Webseite ihn jetzt so begrüßen, wie er es gewählt hat.do_POST funktioniert nicht auf http.server mit Python

Während GET scheint gut zu funktionieren, ist POST nicht. Ich habe versucht, das Debuggen von jeder Codeausführung beim Drucken und es scheint hier steckte immer:

ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 

Ich werde fügt Sie den Code vollständigen Code unten, zusammen mit meinem Terminal-Ausgang.

Code:

from http.server import BaseHTTPRequestHandler, HTTPServer 
    import cgi 


    class webServerHandler(BaseHTTPRequestHandler): 

     def do_GET(self): 
      try: 
       if self.path.endswith("/hello"): 
        self.send_response(200) 
        self.send_header('Content-type', 'text/html') 
        self.end_headers() 
        output = "" 
        output += "<html><body>" 
        output += "<h1>Hello!</h1>" 
        output += '''<form method='POST' enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form>''' 
        output += "</body></html>" 
        self.wfile.write(output.encode(encoding = 'utf_8')) 
        print (output) 
        return 

       if self.path.endswith("/hola"): 
        self.send_response(200) 
        self.send_header('Content-type', 'text/html') 
        self.end_headers() 
        output = "" 
        output += "<html><body>" 
        output += "<h1>&#161 Hola !</h1>" 
        output += '''<form method='POST' enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form>''' 
        output += "</body></html>" 
        self.wfile.write(output.encode(encoding = 'utf_8')) 
        print (output) 
        return 

      except IOError: 
       self.send_error(404, 'File Not Found: %s' % self.path) 

     def do_POST(self): 
      try: 
       self.send_response(201) 
       print("Sent response") 
       self.send_header('Content-type', 'text/html') 
       print("Sent headers") 
       self.end_headers() 
       print("Ended header") 
       ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
       print("Parsed headers") 
       if ctype == 'multipart/form-data': 
        fields = cgi.parse_multipart(self.rfile, pdict) 
        messagecontent = fields.get('message') 
       print("Receiver message content") 
       output = "" 
       output += "<html><body>" 
       output += " <h2> Okay, how about this: </h2>" 
       output += "<h1> %s </h1>" % messagecontent[0] 
       output += '''<form method='POST' enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form>''' 
       output += "</body></html>" 
       print(output) 
       self.wfile.write(output.encode(encoding = 'utf_8')) 
       print ("Wrote through CGI") 
      except: 
       pass 


    def main(): 
     try: 
      port = 8080 
      server = HTTPServer(('', port), webServerHandler) 
      print ("Web Server running on port", port) 
      server.serve_forever() 
     except KeyboardInterrupt: 
      print (" ^C entered, stopping web server....") 
      server.socket.close() 

    if __name__ == '__main__': 
     main() 

Terminal-Ausgang:

Web Server running on port 8080 
127.0.0.1 - - [28/Apr/2016 13:28:59] "GET /hello HTTP/1.1" 200 - 
<html><body><h1>Hello!</h1><form method='POST'  enctype='multipart/form-data' action='/hello'><h2>What would you like me to say?</h2><input name="message" type="text" ><input type="submit" value="Submit"> </form></body></html> 
127.0.0.1 - - [28/Apr/2016 13:29:09] "POST /hello HTTP/1.1" 201 - 
Sent response 
Sent headers 
Ended header 

Wie Sie sehen können, die POST-Funktion scheint nicht beyong der parse_header Befehl zu gehen. Ich kann das nicht herausfinden, und jede Hilfe wäre nützlich!

+0

Ihre Frage zeigt an, dass Sie Python 3 verwenden, nicht zu verwirren, sollten Sie umfassen die Python-Version Sie verwenden, und erwartet, dass es auf arbeiten:) –

Antwort

1

Es ist jetzt zu spät. Ich werde diese Antwort jedoch trotzdem posten, da ich während eines Online-Tutorials mit demselben Problem konfrontiert war. Hoffe, das wird jemandem helfen, wenn jemand über das gleiche Problem stolpert.

In diesem Tutorial verwendete der Kursleiter Python 2 und ich benutzte Python 3.6.

Changelog im Vergleich zu dem, was Lehrer sagte:

  • verwendet get-Methode statt getHeader während Header-Parsing, verursacht self.headers eine Instanz der Klasse ist 'Message'. Und es bietet Get-Methode.
  • Konvertierte Grenze in Bytes vor dem Parsen der mehrteiligen Nachricht. Hier

, ist eine Kopie des Arbeits Code

from http.server import BaseHTTPRequestHandler, HTTPServer 
import cgi 

class webserverHandler(BaseHTTPRequestHandler): 
    """docstring for webserverHandler""" 

def do_GET(self): 
    try: 
     if self.path.endswith("/hello"): 
      self.send_response(200) 
      self.send_header('Content-Type', 'text/html') 
      self.end_headers() 

      output = "" 
      output += '<html><body>Hello!' 
      output += '<form method="POST" enctype="multipart/form-data" action="/hello"><h2> What would you like me to say?</h2><input name="message" type="text" /><input type="submit" value="Submit" /></form>' 
      output += '</body></html>' 
      self.wfile.write(output.encode()) 
      print(output) 
      return 

     if self.path.endswith("/hola"): 
      self.send_response(200) 
      self.send_header('Content-Type', 'text/html') 
      self.end_headers() 

      output = "" 
      output += '<html><body>&#161Hola <a href="/hello">Back to Hello</a>' 
      output += '<form method="POST" enctype="multipart/form-data" action="/hello"><h2> What would you like me to say?</h2><input name="message" type="text" /><input type="submit" value="Submit" /></form>' 
      output += '</body></html>' 
      self.wfile.write(output.encode()) 
      print(output) 
      return 

    except IOError: 
     self.send_error(404, "File not found %s" % self.path) 

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


def main(): 
try: 
    port = 8000 
    server = HTTPServer(('', port), webserverHandler) 
    print("Web server running on port %s" % port) 
    server.serve_forever() 

except KeyboardInterrupt: 
    print(" ^C entered stopping web server...") 
    server.socket.close() 

    if __name__ == '__main__': 
     main() 
0

konnte ich Ihren Code korrekt ausgeführt wird, und erhalten POST, zu arbeiten, nachdem die folgende Änderung vornehmen:

Sie haben:

from http.server 

Ändern Sie diesen an:

from BaseHTTPServer 

Und es sollte funktionieren.

+0

Hängt von Ihrer Python-Version ab, für Python2 ist es BaseHTTPServer, aber für Python3 ist es http.server. –