Skip to main content
 首页 » 编程设计

python之在 Python BaseHTTPServer 中获取 GET 和 POST 请求数据

2025年05月04日14txw1958

我在尝试获取 GET 和 POST 数据时遇到此错误。

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 

请您参考如下方法:

要解决即时错误,您可以使用:

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。