6

In my python script, I am trying to run a web server:

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

I have a request handler class:

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

Now I always wait for some data to catch in do_GET. I want to implement a timeout operation where I want this web server to close after lets say 60 seconds. I am not able to implement that. Please suggest me how can I implement auto shut down operation for web server in this scenario.

Thanks Tara Singh

4

7 回答 7

8

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

由于BaseHTTPRequestHandlerextendsStreamRequestHandler又是 extends BaseRequestHandler,您可以重写setup()以使用超时初始化套接字:

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

  def do_GET(self):
    # ...
于 2010-12-12T00:10:31.417 回答
6

我实际上发现,如果我随后调用超类,那么在 def setup 中为 self.timeout 设置一个值是行不通的。看起来在创建 HTTPServer 实例期间没有调用Handler 的 setup 和init方法。我使用 pydevd 来确认这一点。

于是,我倒退了一步:

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

完美运行,无需覆盖核心代码或构建您自己的派生类。如果您想这样做,您似乎必须覆盖 HTTPServer 代码,而不是 Handler 代码。

于 2016-10-05T06:06:01.760 回答
3
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    timeout = 60 # StreamRequestHandler.setup
    def do_GET(self):
        # Doing Some Stuff.
于 2018-05-14T09:49:00.733 回答
2

我设法让HTTP请求超时

self.rfile._sock.settimeout(60)

希望这可以帮助

于 2011-09-16T16:57:47.280 回答
2

正如Tey'TinBane的回答中指出的那样,timeout属性不适用于serve_forever()方法,如文档中所述:

server_forever

解决方法是使用自定义循环来处理user3483992指出的请求

while True: server.handle_request()

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

在此处输入图像描述

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

在此处输入图像描述

一个解决方案是为此方法提供另一种实现,例如(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
于 2020-05-06T19:46:09.883 回答
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>
于 2014-04-01T07:31:01.973 回答
1
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)   
    self.timeout = 60
于 2014-02-21T06:53:55.907 回答