如何在BaseHTTPServer.BaseHTTPRequestHandler中实现超时 Python
在我的Python脚本中,我正在尝试运行一个网络服务器:
server = BaseHTTPServer.HTTPServer(('127.0.0.1',8080), RequestHandler)
我有一个请求处理类:
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
# Doing Some Stuff.
现在我总是等待一些数据在do_GET中被捕获。我想实现一个超时操作,也就是说我希望这个网络服务器在大约60秒后自动关闭。但是我不知道该怎么做。请告诉我如何在这种情况下实现网络服务器的自动关闭操作。
谢谢 塔拉·辛格
8 个回答
在编程中,很多时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序中使用这些数据。这个过程就像是从冰箱里拿食材,然后用这些食材做饭一样。
有时候,我们会遇到一些问题,比如数据格式不对,或者数据缺失。这就像是你打开冰箱,发现缺少了做菜的某个重要食材,这样你就不能做出你想要的菜了。
为了避免这些问题,程序员通常会在代码中加入一些检查,确保数据是正确的。这就像是在做饭之前,先检查一下冰箱里有没有所有需要的食材。
总之,处理数据就像做饭一样,需要仔细检查,确保一切都准备好了,这样才能做出美味的菜肴。
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
timeout = 60 # StreamRequestHandler.setup
def do_GET(self):
# Doing Some Stuff.
我发现,如果在def setup中给self.timeout设置一个值,然后再调用父类的方法,这个设置就不起作用了。看起来在创建HTTPServer实例的时候,Handler的setup和init方法并没有被调用。我用pydevd确认了这一点。
所以,我退了一步:
httpd = BaseHTTPServer.HTTPServer(server_address, MyHttpHandler)
httpd.timeout = 10
这样做效果很好,而且不需要覆盖核心代码,也不需要自己构建派生类。如果你想那样做,似乎需要覆盖HTTPServer的代码,而不是Handler的代码。
假设我理解你的问题没错,你不能在 do_GET
方法里设置读取超时,因为在这个方法被调用时,请求已经被读取了。
因为 BaseHTTPRequestHandler
是从 StreamRequestHandler
继承而来的,而 StreamRequestHandler
又是从 BaseRequestHandler
继承的,所以你可以重写 setup()
方法来初始化套接字并设置超时:
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def setup(self):
BaseHTTPServer.BaseHTTPRequestHandler.setup(self)
self.request.settimeout(60)
def do_GET(self):
# ...