Ich habe es schon mal hier http://python.sandtner.org/viewtopic.php?t=2741 nachgefragt, aber noch keine funktionierende Lösung gefunden...
Ich möchte den CGIHTTPServer mit einem CGI-Skript, welches von ihm selber Ausgeführt wird, beenden bzw. neustarten...
Nun hab ich gesehen, das serve_forever() einfach nur eine endlos-while-Schleife ist, die immer self.handle_request() aufruft... Ich denke hier könnte man ansetzten und ein bedingter abbruch der Schleife einbauen...
Nun suche ich nach einer Möglichkeit dem Server auch zu sagen, "nun beende dich mal" Eine Methode, die BlackJack in den o.g. Thread eingeworfen hat, wäre einfach eine bestimmte URL abzurufen wie "\kill.me"... Das könnte man in RequestHandler().is_cgi() abfragen... Aber ich brauche die Informationen in der CGIHTTPServer Klasse. Da weiß ich nicht, wie ich ran kommen kann...
CGIHTTPServer mit eigenem CGI beenden/neustarten
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Eine schnelle, aber doofe Lösung wäre es die spezielle URL in RequestHandler().is_cgi() anzufragen und mit os.kill() den eigenen Prozess abzuschiessen... Nur wie finde ich die PID des eigenen Skriptes raus?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Dank eines Tipps aus der news-Group, hab ich nun eine Möglichkeit gefunden...
Beispiel für ein ServerShutdown - CGI:
Hier die Modifizierte Server-Klasse:
Das ganze funktioniert über die Variable self.ServerLoop Diese wird in __init__ auf True gesetzt, wodurch eine Endlos-Scheife in serve_forever() funktioniert, bis ein KeyboardInterrupt von einem CGI-File ausgelöst wird...
Verbesserungs Vorschläge erwünscht!
Beispiel für ein ServerShutdown - CGI:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-
print "Content-Type: text/html\n\n"
print "<h2>Server wird beender</h2>"
raise KeyboardInterrupt, "Server wird beendet"
Code: Alles auswählen
class MyThreadingServer( SocketServer.ThreadingTCPServer ):
allow_reuse_address = 1 # Seems to make sense in testing environment
def __init__(self, server_address, request_handler, AllowIPs):
SocketServer.ThreadingTCPServer.__init__(self, server_address, request_handler)
self.ServerLoop = True
def serve_forever(self):
"""Handle Request loop solange self.ServerLoop==True ist"""
while self.ServerLoop:
self.handle_request()
def handle_error(self, request, client_address):
"""Handle an error gracefully.
The default is to print a traceback and continue.
"""
print '-'*40
import exceptions
if sys.exc_type == exceptions.KeyboardInterrupt:
print "Server wird beendet!"
self.ServerLoop = False
return
# Normale Fehlerausgabe
print 'Exception happened during processing of request from',
print client_address
import traceback
traceback.print_exc() # XXX But this goes to stderr!
print '-'*40
Verbesserungs Vorschläge erwünscht!