Как реализовать Timeout в BaseHTTPServer.BaseHTTPRequestHandler Python - PullRequest
3 голосов
/ 12 декабря 2010

В моем скрипте на Python я пытаюсь запустить веб-сервер:

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

У меня есть класс обработчика запросов:

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

Теперь я всегда жду, пока какие-нибудь данные попадут в do_GET. Я хочу реализовать операцию тайм-аута, когда я хочу, чтобы этот веб-сервер закрывался, скажем, через 60 секунд. Я не могу это реализовать. Пожалуйста, предложите мне, как я могу реализовать операцию автоматического выключения для веб-сервера в этом сценарии.

Спасибо Тара Сингх

Ответы [ 6 ]

7 голосов
/ 12 декабря 2010

Предполагая, что я правильно понял ваш вопрос, вы не можете реализовать тайм-аут чтения в 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):
    # ...
2 голосов
/ 14 мая 2018
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    timeout = 60 # StreamRequestHandler.setup
    def do_GET(self):
        # Doing Some Stuff.
2 голосов
/ 05 октября 2016

Я на самом деле обнаружил, что установка значения для self.timeout в настройке def не сработала, если бы я затем вызвал суперкласс. Похоже, что настройки обработчика и методы init не вызываются при создании экземпляра HTTPServer. Я использовал pydevd, чтобы подтвердить это.

Итак, я сделал шаг назад:

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

Работает отлично, без переопределения основного кода или создания собственных производных классов. Похоже, вам придется переписать код HTTPServer, а не код обработчика, если вы хотите сделать это таким образом.

2 голосов
/ 16 сентября 2011

Мне удалось заставить тайм-ауты работать для HTTP-запросов с

self.rfile._sock.settimeout(60)

Надеюсь, это поможет

1 голос
/ 01 апреля 2014
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>
1 голос
/ 21 февраля 2014
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)   
    self.timeout = 60
...