do_POST not working on http.server with python
Pierre Quentel
pierre.quentel at gmail.com
Sun May 1 15:16:18 EDT 2016
Le jeudi 28 avril 2016 10:36:27 UTC+2, Rahul Raghunath a écrit :
> 0
> down vote
> favorite
>
>
> I'm trying to create a simple http server with basic GET and POST functionality. The program is supposed to GET requests by printing out a simple webpage that greets a user and askes how he would rather be greeted. When the user enters a greeting of his choice, the webpage should now greet him as he had chosen.
>
> While GET seems to be working fine, POST is not. I tried debugging by printing at every code execution and it seems to be getting stuck here:
>
> ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
>
> I'll paste the code full code below, along with my terminal output.
>
> 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>¡ 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 Output:
>
> 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
>
> As you can see, the POST function does not seem to go beyong the parse_header command. I cannot figure this out, and any help would be usefu!
Hi,
It's generally not considered good practise to silently ignore exceptions in a try/except where the except clause is just :
except:
pass
If you remove the try/except in do_POST you will see this interesting error message :
AttributeError: 'HTTPMessage' object has no attribute 'getheader'
More information about the Python-list
mailing list