如何在BaseHTTPServer.BaseHTTPRequestHandler中实现超时 Python

7 投票
8 回答
18400 浏览
提问于 2025-04-16 08:24

在我的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 个回答

3

在编程中,很多时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序中使用这些数据。这个过程就像是从冰箱里拿食材,然后用这些食材做饭一样。

有时候,我们会遇到一些问题,比如数据格式不对,或者数据缺失。这就像是你打开冰箱,发现缺少了做菜的某个重要食材,这样你就不能做出你想要的菜了。

为了避免这些问题,程序员通常会在代码中加入一些检查,确保数据是正确的。这就像是在做饭之前,先检查一下冰箱里有没有所有需要的食材。

总之,处理数据就像做饭一样,需要仔细检查,确保一切都准备好了,这样才能做出美味的菜肴。

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

我发现,如果在def setup中给self.timeout设置一个值,然后再调用父类的方法,这个设置就不起作用了。看起来在创建HTTPServer实例的时候,Handler的setup和init方法并没有被调用。我用pydevd确认了这一点。

所以,我退了一步:

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

这样做效果很好,而且不需要覆盖核心代码,也不需要自己构建派生类。如果你想那样做,似乎需要覆盖HTTPServer的代码,而不是Handler的代码。

12

假设我理解你的问题没错,你不能在 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):
    # ...

撰写回答