HTTPServer DefaultHandler nur für bestimmte Aktionen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Donnerstag 21. April 2016, 22:04

Ich brauche einen ganz simplen HTTP Webserver so wie hier um eine einfache API zu erstellen:

Code: Alles auswählen

httpd = BaseHTTPServer.HTTPServer(("", port), HttpHandler)
httpd.serve_forever()
Meine Web-API reagiert über meinen eigenen BaseHTTPRequestHandler auf virtuelle (ausgedachte) URL-Pfade durch Überschreiben der `do_GET` Methode, also sowas wie

Code: Alles auswählen

/my/virtual/path/do?something
Zum Steuern der API gibt's ein simples HTML-Interface für den Browser. Funktioniert auch alles bestens soweit.

Nun möchte ich aber meine Web-GUI noch etwas mit CSS aufhübschen und benutze dafür ein Boilerplate-Tool welches mehrere Dateien laden muss, darunter .css, .js und Bilder.

Mein Problem: mein eigener Handler verhindert, dass diese Dateien geladen werden, da der ja nur auf eigene URL-Pfade reagiert (wird geparst).

Frage: Kann ich meinem Handler befehlen, dass der auf meine eigenen URL-Pfade so funktioniert wie ich das will und für alles andere "ganz normal" so wie die originale `BaseHTTPRequestHandler.do_GET()`?
BlackJack

Donnerstag 21. April 2016, 22:25

@droptix: Wenn Dein Handler erkannt hat, dass die URL nicht für ihn ist, kann er doch einfach den der Basisklasse aufrufen.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Freitag 22. April 2016, 09:44

Genau das wäre das Ziel, aber wie macht man das? Mein Code hier.

Mein Problem ist, dass ich den Pfad ja erst innerhalb meines Handlers auswerten kann. Dann bin ich ja aber schon "drin" :wink: und komm ja nicht wieder raus, oder?

Außerdem ist mir aufgefallen, dass ja der BaseHTTPRequestHandler gar keine `do_GET` Methode besitzt. Ich kann demnach auch nicht sowas hier machen:

Code: Alles auswählen

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        if not self.path.startswith('/my/'):
            BaseHTTPRequestHandler.do_GET(self)
Ideen?
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Freitag 22. April 2016, 09:50

Ach, ich Dussel :evil: So macht man's richtig!

Lösung: BaseHTTPRequestHandler hat kein do_GET, aber der SimpleHTTPRequestHandler :mrgreen: geschnallt!

Danke, manchmal hilft es sich zu unterhalten...
Antworten