如何在BaseHTTPServer.BaseHTTPRequestHandler Python中实现Timeout

时间:2010-12-11 23:45:04

标签: python basehttpserver

在我的python脚本中,我正在尝试运行Web服务器:

server = BaseHTTPServer.HTTPServer(('127.0.0.1',8080), RequestHandler)

我有一个请求处理程序类:

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        # Doing Some Stuff.

现在我总是等待一些数据来捕获do_GET。我想实现一个超时操作,我希望这个Web服务器在60秒之后关闭。我无法实现这一点。请建议我如何在这种情况下为Web服务器实现自动关闭操作。

由于 塔拉辛格

7 个答案:

答案 0 :(得分:7)

假设我已正确理解您的问题,您无法在do_GET中实现读取超时,因为在调用此方法时已经读取了请求。

由于BaseHTTPRequestHandler扩展StreamRequestHandler,后者又扩展BaseRequestHandler,您可以覆盖setup()以使用超时初始化套接字:

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def setup(self):
    BaseHTTPServer.BaseHTTPRequestHandler.setup(self)
    self.request.settimeout(60)

  def do_GET(self):
    # ...

答案 1 :(得分:2)

我设法通过

获得HTTP请求的超时时间
self.rfile._sock.settimeout(60)

希望这有帮助

答案 2 :(得分:2)

我实际上发现,如果我调用了超类,那么在def setup中为self.timeout设置一个值并不起作用。看起来在创建HTTPServer实例期间不会调用Handler的设置和 init 方法。我使用pydevd来证实这一点。

所以,我采取了向后的步骤:

httpd = BaseHTTPServer.HTTPServer(server_address, MyHttpHandler)
httpd.timeout = 10

完美无缺,无需覆盖核心代码,或构建自己的派生类。看起来你不得不覆盖HTTPServer代码而不是Handler代码,如果你想这样做的话。

答案 3 :(得分:2)

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    timeout = 60 # StreamRequestHandler.setup
    def do_GET(self):
        # Doing Some Stuff.

答案 4 :(得分:1)

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)   
    self.timeout = 60

答案 5 :(得分:1)

timeout = 0.1  # seconds

class WebHTTPServer(BaseHTTPServer.HTTPServer):
    def server_bind(self):
        BaseHTTPServer.HTTPServer.server_bind(self)
        self.socket.settimeout(timeout)

class WebReqHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    <etc> 

if __name__ == '__main__':
    server = WebHTTPServer(('',port), WebReqHandler)
    while 1:
        server.handle_request()
        <do other things>

答案 6 :(得分:1)

正如Tey'TinBane的答案中指出的,timeout属性不适用于serve_forever()方法,如doc中所述:< / p>

server_forever

解决方法是使用自定义循环来处理user3483992

指出的请求
while True: server.handle_request()

handle_request()然后将在给定超时结束时按预期触发方法handle_timeout()

enter image description here

...除了handle_timeout方法什么都不做:

enter image description here

然后一种解决方案是为此方法提供另一种实现,例如(credit here):

server.handle_timeout = lambda: (_ for _ in ()).throw(TimeoutError())

简而言之:

try:
     server = HTTPServer(('', PORT_NUMBER), `yourAwesomeRequestHandler`)
     server.timeout = 10
     server.handle_timeout = lambda: (_ for _ in ()).throw(TimeoutError())
     while True: server.handle_request()
except TimeoutError:
    // TODO