2013-02-05 67 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链接的示例将帮助您开始。