CGI mod_python und OOP

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
mjbohn
User
Beiträge: 2
Registriert: Sonntag 21. Oktober 2007, 14:35

Sonntag 21. Oktober 2007, 14:52

Hi all

Bei meinen Versuchen mit mod_python bin zu dem Schluß gekommen, dass ich
mit OOP nicht weiter komme. Möglicherweise habe ich aber die Arbeitsweise von mod_python
noch nicht ganz durchschaut.
Soweit ich es verstehe, muss bei mod_python die HTML-Ausgabe über den Return einer Methode erfolgen

Code: Alles auswählen

def meinHTML():
  var="""
[mein  HTML]
"""
  return var
Das ist nicht besonders hilfreich, wenn ich meine dyn. erzeugten Seiten z.B. in einem Tree abbilden möchte
Was mir unter CGI recht einfach gelingt:

Code: Alles auswählen

from Node import Node
class Seite(Node):
  
  def __init__(self,title=""):
    Node.__init__(self)
    self.__title=title
    
  def render(self):
    print "Content-Type: text/html"
    print
    print "<html><head><title>%s</title></head>" %(self.__title)
    print "<body>"
    print "BODY"
    for child in self.getChilds():
      child.render()
      
    print "<br>"
    print "<hr>"
    print "</body>"
    print "</html>"
 
  
class Inhalt(Node):
  def __init__(self,parent=None,data=None):
    Node.__init__(self,parent=parent)

  def render(self):
    print "<hr>"
    print "neuer INHALT %s<p>"
    print "<hr>"
    
seite1 = Seite(title="Seite1")
i1= Inhalt(parent=seite1)

seite1.render()

Die Klasse "Node" bildet in diesem Beispiel die Baumstruktur.

Habe ich jetzt die Funktionsweise von mod_python nicht verstanden oder muss
ich bei CGI bleiben?

Dank & Gruss
Michel
BlackJack

Sonntag 21. Oktober 2007, 15:43

Du müsstest halt die ``print``\s in den `render()`-Methoden so umschreiben, dass die Methoden den Inhalt zurückgeben statt ihn auszugeben.

Andererseits würde ich eher zu einem Template-System statt der `render()`-Methoden raten. Das ist sauberer und auf Dauer einfacher zu warten und erweitern.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Sonntag 21. Oktober 2007, 16:00

ich hatte mal die geniale idee ueber yield eine "templating engine" zu basteln
und kann nur sagen:
am besten du benutzt gleich eine "richtige" templating engine:
um so meher HTML du schreibst, umso komlizierter und unuebersichtlicher wird das mit dem print und umso mehr arbeit musst dan aufbringen um alles spaeter auf vernuenftiger basis umzugestalten
cp != mv
mjbohn
User
Beiträge: 2
Registriert: Sonntag 21. Oktober 2007, 14:35

Montag 22. Oktober 2007, 09:19

Hi all
erst mal danke für die schnellen Antworten :-)

Natürlich möchte ich hier nicht das Rad neu erfinden. Die gängigen Template-Engines und Frameworks sind mir bekannt.

Ich habe nur beim rumtesten mit meinem Treeobjekt HTML zu Darstellung nutzen wollen.
Dabei ist mir halt aufgefallen, dass das mit CGI "einfach so" funzt und mod_python die Ausgabe im Return macht.

Wenn das mit mod_python nun tatsächlich nur im return funktioniert ist das IMHO recht umständlich sobald man irgend was verschachteltes ausgibt oder mit Rekursion arbeitet.

Deshalb besteht immer noch meine Frage:
Kann mod_python das auch anders?

cu
Michel
BlackJack

Montag 22. Oktober 2007, 09:33

Wieso ist das umständlich? Es ist bloss etwas anders. Statt die Zeichenketten auszugeben muss man sie nur "sammeln" und am Ende zurückgeben.

Umständlich finde ich eher die Vermischung von HTML und Python auf diese Weise.

Und die Variante mit ``return`` ist flexibler. Man kann das ganze immer noch als CGI benutzen, indem man am Ende den Rückgabewert mit ``print`` ausgibt, man kann das Ergebnis in einer Datei oder Datenbank speichern, noch nachbearbeiten usw.
Antworten