2013-02-05 97 views
1

我試圖打印使用內置的HTTP服務器的一些簡單的變量在PythonPython的簡單Web服務器

class WebServer: 
    def __init__(self): 
     from BaseHTTPServer import HTTPServer 
     import urlparse 
     server = HTTPServer(('', 8080), self.do_GET) 
     server.serve_forever() 

    def do_GET(self): 
     parsed_path = urlparse.urlparse(self.path) 
     message_parts = [ 
       'CLIENT VALUES:', 
       'client_address=%s (%s)' % (self.client_address, self.address_string()), 
       'command=%s' % self.command, 
       'path=%s' % self.path, 
       'real path=%s' % parsed_path.path, 
       'query=%s' % parsed_path.query, 
       'request_version=%s' % self.request_version, 
       '', 
       'SERVER VALUES:', 
       'server_version=%s' % self.server_version, 
       'sys_version=%s' % self.sys_version, 
       'protocol_version=%s' % self.protocol_version, 
       '', 
       'HEADERS RECEIVED:', 
       ] 
     for name, value in sorted(self.headers.items()): 
      message_parts.append('%s=%s' % (name, value.rstrip())) 
     message_parts.append('') 
     message = '\r\n'.join(message_parts) 
     self.send_response(200) 
     self.end_headers() 
     self.wfile.write(message) 
     return 

但我似乎得到這個錯誤:

Exception happened during processing of request from ('10.0.1.3', 52251) 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
TypeError: do_GET() takes exactly 1 argument (4 given) 
---------------------------------------- 

高清do_GET(個體經營):似乎接受更多然後只是自我,我錯過了什麼?

+0

你不需要一個'HandlerClass'? – imreal

+0

在這種情況下是不是self.do_GET? – HyperDevil

+1

看看你正在使用的模塊的文檔:)當你需要一個完全成熟的對象時,你需要傳遞一個函數http://docs.python.org/2/library/basehttpserver.html#BaseHTTPServer。 BaseHTTPRequestHandler – slezica

回答

2

繼承WebServer從請求處理程序是這樣的:

class WebServer(BaseHTTPRequestHandler): 

你可能將不得不改變你的進口這一點。

然後它作爲參數傳遞給HTTPServer這樣的:

server = HTTPServer(('', 8080), WebServer) 
+0

現在我似乎得到了__INIT__錯誤:http://pastebin.com/UubcHjSa – HyperDevil

+0

它適用於我如果我在'WebServer'的定義之後移動server = HTTPServer(('',8080),WebServer) server.serve_forever()'。 – imreal

+1

http://pastebin.com/YEZeDSes – imreal

2

當傳遞BaseHTTPRequestHandler時,您正在傳遞函數。換句話說,Python試圖使用方法來實例化對象,但是您已經提供了一個函數,它使用了不同數量的參數。

而不是傳遞一個普通的函數,sublcass BaseHTTPRequestHandler。在註釋中通過@ dm03514鏈接的示例將幫助您開始。