CGI mit jon.cgi: Wie wird wann Klasse instanziert?

Code-Stücke können hier veröffentlicht werden.
Antworten
Merlin
User
Beiträge: 1
Registriert: Montag 18. November 2013, 15:06

Hallo Forum,
erst mal ein kurzes "Hallo" und "Dankeschön" an die Betreiber.
Ich freue mich, jetzt auch ein deutschsprachiges Forum gefunden zu haben und dazu auch gleich die erste Frage.

Es geht um den Einsatz von dem jon.cgi Modul, dazu folgendes Snippet:

Code: Alles auswählen

import jon.cgi as cgi
class Handler(cgi.Handler):
    def test(self,a):
        print(a)
    
    self.test("test")
    
    def process(self,request):
        pass
 
cgi.CGIRequest(Handler).process()
Dazu folgende Frage(n):
- Die Klasse Handler erbt von cgi.Handler und muss die Funktion process() implementieren.
Diese wird durch den CGI Aufruf gestartet.

Jetzt habe ich eine Funktion test():
- Diese wird bereits in der Definition nicht akzeptiert, weil self eine Referenz auf die eigene Instanz ist.
- Doch diese wird offensichtlich nicht erzeugt.

1. An welcher Stelle kann ich diese instanzieren?
Oder anders: Wer erzeugt ein Objekt der Klasse "Handler"?

Selbst wenn ich eine __init__ schreibe, ist mir unklar, wann die aufgerufen wird (und von wem?).

2. Der Aufruf (self.test) klappt natürlich auch nicht, da es das Objekt noch nicht gibt... :-(

Weiterführen würden sich die Frage/Konsequenz ergeben:
- Wenn die CGI Schnittstelle ohnehin immer nur process() aufruft, wieso muss ich dann eine ganze Klasse erzeugen (und von cgi.Handler erben) wenn ich kein Objekt erzeugen kann.

Letztlich ist es das Ziel, dass ich der Klasse "Handler" noch viele Attribute und Methoden geben kann - und diese auch verwende.
Dann brauch ich aber auch ein Objekt....

Wäre super, wenn hier jemand eine Idee hat.

Danke und Gruß
Merlin
BlackJack

@Merlin: Die Stelle an der Du ``self.text("test")`` ist im Klassenkörper, der Code auf der Ebene wird ausgeführt wenn die Klassendefinition ausgeführt wird. Da gibt es noch keine Instanz, ja noch nicht einmal die Klasse, denn die ist erst definiert wenn der Code Klassenkörper komplett ausgeführt ist. Da Du das später selbst schreibst verstehe ich nicht was Du damit meinst das die Definition nicht akzeptiert wird‽ Die Methodendefinition selber ist in Ordnung so, das ist gültiger Python-Code. Wenn auch stilistisch nicht gut das `self` nicht verwendet wird und es damit semantisch gar keine Methode ist.

Ein Exemplar von `Handler` wird irgendwann von Code im `CGIRequest`-Objekt erstellt, also zum Beispiel in dessen `__init__()`- oder in dessen `process()`-Methode oder einer Funktion oder Methode die indirekt von denen aufgerufen werden.

Diese `Handler`-Objekte werden von den `Request`-Objekten jedes mal zur bearbeitung einer Anfrage erzeugt. Bei CGI gibt es pro Anfrage immer nur ein `Request`-Objekt welches genau einmal ein `Handler`-Objekt erzeugt. So funktioniert CGI nun mal. Das ist aber nicht bei allen `Request`-Objekten so. Für andere Protokolle wird einmal ein `Request`-Objekt erzeugt dem die `Handler`-Klasse übergeben wird und dann erzeugt das für jede Anfrage immer wieder neue `Handler`-Objekte.

Du solltest dem `Handler`-Objekt nicht noch viele Attribute geben, das hat schon genug, sondern in der `process()`-Methode das erledigen was halt bei einer Anfrage erledigt werden muss. Dafür kannst Du *dort* ja beliebige andere Objekte erzeugen mit Attributen und Methoden Deiner Wahl.

Wobei mich dieses CGI/Handler-basierte Konzept von `jon` nicht wirklich überzeugt. So etwas wie URL-Mapping/-Routing muss man sich anscheinend selber schreiben. Das erscheint mir alles irgendwie unrund und altertümlich und WSGI-Unterstützung wird in der Dokumentation als „experimentell” beschrieben.

Ich würde ja eher ein modernes Mikrorahmenwerk wie Bottle oder Flask empfehlen. Die sind moderner und haben aktive Entwickler und Benutzer.
Antworten