2016-05-04 78 views
0

我在獲取GET和POST數據時遇到此錯誤。在Python中獲取GET和POST請求數據BaseHTTPServer

Exception happened during processing of request from ('127.0.0.1', 62635) 
Traceback (most recent call last): 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 655, in __init__ 
    self.handle() 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 340, in handle 
    self.handle_one_request() 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 328, in handle_one_request 
    method() 
    File "server1.py", line 30, in do_GET 
    print form.getvalue["foo"] 
TypeError: 'instancemethod' object has no attribute '__getitem__' 

代碼

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import SocketServer 
import cgitb; cgitb.enable() 
import cgi 


class GP(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 
    def do_HEAD(self): 
     self._set_headers() 
    def do_GET(self): 
     self._set_headers() 
     form = cgi.FieldStorage() 
     print form.getvalue["foo"] 
     self.wfile.write("<html><body><h1>Get Request Received!</h1></body></html>") 
    def do_POST(self): 
     self._set_headers() 
     form = cgi.FieldStorage() 
     print form.getvalue["foo"] 
     self.wfile.write("<html><body><h1>POST Request Received!</h1></body></html>") 

def run(server_class=HTTPServer, handler_class=GP, port=8088): 
    server_address = ('', port) 
    httpd = server_class(server_address, handler_class) 
    print 'Server running at localhost:8088...' 
    httpd.serve_forever() 

run() 

運行代碼,我得到了上述錯誤。這段代碼有什麼問題?

python server1.py 
curl http://localhost:8088?foo=bar 
curl -d "foo=bar" http://localhost:8088 

回答

2

爲了解決眼前的錯誤,你可以使用:的

form.getvalue("foo") 

代替:

form.getvalue["foo"] 

這是造成:

TypeError: 'instancemethod' object has no attribute '__getitem__' 

另外(如建議在https://stackoverflow.com/a/25091973),您可能需要使用:

form = cgi.FieldStorage(
    fp=self.rfile, 
    headers=self.headers, 
    environ={'REQUEST_METHOD': 'POST'} 
) 

代替:

form = cgi.FieldStorage() 

POST請求處理程序。

GET請求處理程序中,可能需要使用urlparse.parse_qs(對於Python 2)或urllib.parse.parse_qs(對於Python 3)代替cgi.FieldStorage

0

基於從二進制樺樹

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
from urlparse import parse_qs 
import cgi 

class GP(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 
    def do_HEAD(self): 
     self._set_headers() 
    def do_GET(self): 
     self._set_headers() 
     print parse_qs(self.path[2:]) 
     self.wfile.write("<html><body><h1>Get Request Received!</h1></body></html>") 
    def do_POST(self): 
     self._set_headers() 
     form = cgi.FieldStorage(
      fp=self.rfile, 
      headers=self.headers, 
      environ={'REQUEST_METHOD': 'POST'} 
     ) 
     print form.getvalue("foo") 
     self.wfile.write("<html><body><h1>POST Request Received!</h1></body></html>") 

def run(server_class=HTTPServer, handler_class=GP, port=8088): 
    server_address = ('', port) 
    httpd = server_class(server_address, handler_class) 
    print 'Server running at localhost:8088...' 
    httpd.serve_forever() 

run() 
答案的工作版本