2010-12-11 7 views
1

Dans mon script python, je suis en train de lancer un serveur web:Comment mettre en œuvre Délai d'attente dans BaseHTTPServer.BaseHTTPRequestHandler Python

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

J'ai une classe de gestionnaire de requêtes:

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

Maintenant, je toujours Attendez que des données soient capturées dans do_GET. Je veux implémenter une opération de temporisation où je veux que ce serveur Web se ferme après laisse dire 60 secondes. Je ne suis pas capable de l'appliquer. S'il vous plaît me suggérer comment puis-je mettre en œuvre l'opération d'arrêt automatique pour le serveur Web dans ce scénario.

Merci Tara Singh

Répondre

4

En supposant que je l'ai bien compris votre question, vous ne pouvez pas mettre en œuvre un délai d'attente de lecture dans do_GET puisque la demande a déjà été lu par le temps cette méthode est appelée.

Depuis BaseHTTPRequestHandler étend StreamRequestHandler qui à son tour s'étend BaseRequestHandler, vous pouvez remplacer setup() pour initialiser la prise avec un délai d'attente:

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

    def do_GET(self): 
    # ... 
+0

J'ai déjà essayé, ça ne fonctionne pas. Dois-je remplacer toute autre méthode avec l'installation? Je veux juste que le serveur s'éteigne tout seul, peu importe ce qu'il est en train de traiter après 60 secondes. –

+2

Vous devez faire 'self.timeout = 60' avant d'appeler la méthode' 'setup()' de la classe de base (en interne, il appelle 'settimeout' en fonction de ce paramètre.) – malthe

1

J'ai réussi à obtenir les délais d'attente de travail pour les requêtes HTTP avec

self.rfile._sock.settimeout(60) 

Espérons que cela aide

1
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
def __init__(self, request, client_address, server): 
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server) 
    self.timeout = 60 
+0

Le' self.timeout = 60' doit être placé avant l'appel au constructeur de la super classe afin de fonctionner correctement. – Mo2

0
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> 
0

J'ai effectivement trouvé que la définition d'une valeur pour self.timeout dans def setup ne fonctionnait pas si j'appelais alors la superclasse. Il ressemble à la configuration du gestionnaire et les méthodes init ne sont pas appelées lors de la création de l'instance HTTPServer. J'ai utilisé pydevd pour le confirmer.

Alors, je pris un pas en arrière:

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

qui fonctionne parfaitement, et sans écraser le code de base, ou la construction de vos propres classes dérivées. Il semblerait que vous deviez remplacer le code HTTPServer, plutôt que le code Handler, si vous vouliez le faire de cette façon.

+0

Quelqu'un peut-il confirmer que cela fonctionne? Il semble être de loin la solution la plus simple! – Pylinux

+0

Je l'utilise sur le code de production (python 2.7.11). Si ça ne fonctionnait pas pour moi, alors mon code ne fonctionnerait pas. J'ai essayé de faire varier le chiffre, et il est facile de le voir fonctionner, parce que quand je l'enlève, mon processus se bloque jusqu'à ce qu'il reçoive une requête http, ce qui pourrait être des heures plus tard. – TinBane

Questions connexes