2016-05-04 9 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'} 
) 

の代わり:POST要求ハンドラで

form = cgi.FieldStorage() 

GET要求ハンドラで

、あなたの代わりにcgi.FieldStorageurlparse.parse_qs(Pythonの2の場合)またはurllib.parse.parse_qs(Pythonの3)を使用することをお勧めします。

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() 
からの回答に基づいて作業バージョン