do_POST没有使用python在http.server上工作

时间:2016-04-28 08:19:16

标签: python server cgi

我正在尝试使用基本的GET和POST功能创建一个简单的http服务器。该程序应该通过打印出一个迎接用户的简单网页来获取请求,并询问他是如何受到欢迎的。当用户输入他选择的问候语时,网页现在应该按照他的选择迎接他。

虽然GET似乎工作正常,但POST不是。我在每次执行代码时都尝试通过打印进行调试,但似乎陷入了困境:

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

我将粘贴下面的代码完整代码以及终端输出。

代码:

    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()

终端输出:

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

正如您所看到的,POST函数似乎不会出现在parse_header命令中。我无法弄清楚这一点,任何帮助都将是usefu!

2 个答案:

答案 0 :(得分:1)

现在已经太晚了。但是,我仍然会发布这个答案,因为我在阅读在线教程时遇到了同样的问题。希望,如果有人遇到同样的问题,这将有助于某人。

在教程中,讲师使用的是python 2,我使用的是python 3.6。

与教师说的相比,改变日志:

  • 在解析标头时使用get方法而不是getheader,导致self.headers是class&#39; MessageClass&#39;的实例。它提供了get方法。
  • 在解析多部分消息之前将边界转换为字节。

此处是工作代码的副本

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()

答案 1 :(得分:-1)

我能够正确运行您的代码,并在进行以下更改后开始工作:

你有:

from http.server

将其更改为:

from BaseHTTPServer

它应该有用。