我正在尝试使用基本的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>¡ 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!
答案 0 :(得分:1)
现在已经太晚了。但是,我仍然会发布这个答案,因为我在阅读在线教程时遇到了同样的问题。希望,如果有人遇到同样的问题,这将有助于某人。
在教程中,讲师使用的是python 2,我使用的是python 3.6。
与教师说的相比,改变日志:
此处是工作代码的副本
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>¡Hola <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
它应该有用。