在我的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服务器实现自动关闭操作。
由于 塔拉辛格
答案 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>
解决方法是使用自定义循环来处理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