simples rendering mit Cheetah

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

manchmal klappen die einfachsten sachen nicht:
wie kann ich denn einfach nur eine Cheetah template rendern?

hier ein paar misslungene ansaetze:

Code: Alles auswählen

In [9]: from Cheetah.Template import Template

In [10]: str(Template(file='/home/kirsch/Desktop/domino/templates/base.tmpl', se
---------------------------------------------------------------------------
<type 'exceptions.NameError'>             Traceback (most recent call last)

/home/kirsch/<ipython console> in <module>()

/var/lib/python-support/python2.5/Cheetah/Template.py in __str__(self)
    991             mainMethName = getattr(concreteTemplateClass,mainMethNameAtt
    992             if mainMethName:
--> 993                 def __str__(self): return getattr(self, mainMethName)()
    994             elif (hasattr(concreteTemplateClass, 'respond')
    995                   and concreteTemplateClass.respond!=Servlet.respond):

/home/kirsch/_home_kirsch_Desktop_domino_templates_base_tmpl.py in respond(self,

/home/kirsch/_home_kirsch_Desktop_domino_templates_base_tmpl.py in login(self, *

<type 'exceptions.NameError'>: global name 'user' is not defined

In [11]: 

Code: Alles auswählen

In [11]: from Cheetah.Template import Template

In [12]: str(Template(file='/home/kirsch/Desktop/domino/templates/index.tmpl', s
earchList=[{"user": "test"}]))
---------------------------------------------------------------------------
<type 'exceptions.ImportError'>           Traceback (most recent call last)

/home/kirsch/<ipython console> in <module>()

/var/lib/python-support/python2.5/Cheetah/Template.py in __init__(self, source, 
namespaces, searchList, file, filter, filtersLib, errorCatcher, compilerSettings
, _globalSetVars, _preBuiltSearchList)
   1201         ## Now, compile if we're meant to
   1202         if (source is not None) or (file is not None):
-> 1203             self._compile(source, file, compilerSettings=compilerSetting
s)
   1204 
   1205     def generatedModuleCode(self):

/var/lib/python-support/python2.5/Cheetah/Template.py in _compile(self, source, 
file, compilerSettings, moduleName, mainMethodName)
   1489                                       mainMethodName=mainMethodName,
   1490                                       compilerSettings=compilerSettings,
-> 1491                                       keepRefToGeneratedCode=True)
   1492         self.__class__ = templateClass
   1493         # must initialize it so instance attributes are accessible

/var/lib/python-support/python2.5/Cheetah/Template.py in compile(klass, source, 
file, returnAClass, compilerSettings, compilerClass, moduleName, className, main
MethodName, baseclass, moduleGlobals, cacheCompilationResults, useCache, preproc
essors, cacheModuleFilesForTracebacks, cacheDirForModuleFiles, keepRefToGenerate
dCode)
    777                 try:
    778                     co = compile(generatedModuleCode, __file__, 'exec')
--> 779                     exec co in mod.__dict__
    780                 except SyntaxError, e:
    781                     try:

/home/kirsch/_home_kirsch_Desktop_domino_templates_index_tmpl.py in <module>()

<type 'exceptions.ImportError'>: No module named base

In [13]: 

Code: Alles auswählen

def render(template, **namespace):
	print __file__ + ': rendering: ' + template + ' args: ' + str(namespace)
	namespace.update(user=get_user())
	
	#fuer render_last
	ch.session['last_tmpl']  = template
	
	t = getattr(getattr(templates, template), template)()
	
	for key, value in namespace.iteritems():
		setattr(t, key, value)
	
	return str(t)
geht auch nicht *snif*
cp != mv
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also ich habe das auch mal ausprobiert und anfangs sogar den gleichen Fehler mit dem undefinierten User gehabt.

Aber nachdem ich die Doku ein wenig überflogen habe (?Template und ?t1) und die Exceptions angesehen habe eigentlich ganz einfach:

Code: Alles auswählen

In [13]: from Cheetah.Template import Template
In [14]: t1 = Template.compile('Hallo $user, das ist doch wirklich nicht so schwer')
In [15]: print t1(searchList=[{'user' : 'Costi'}])
Hallo Costi, das ist doch wirklich nicht so schwer
Ich tät aber wenn dann lieber Mako nehmen. Templates in Python-Code zu kompilieren war schon ein Ansatz der in Kid nicht funktioniert hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Costi!

Zusatz:

Code: Alles auswählen

>>> from Cheetah.Template import Template
>>> t1 = Template("Hallo $user.")
>>> t1.user = "Costi"
>>> str(t1)
'Hallo Costi.'
>>> 
Man kann den Text der Vorlage schon beim Erstellen der Vorlageninstanz übergeben. -- ohne ``compile`` -- Und man kann einen Parameter direkt als Attribut an die Vorlageninstanz binden. Was ich recht gerne mache.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:

Code: Alles auswählen

>>> from Cheetah.Template import Template
>>> t1 = Template("Hallo $user.")
>>> t1.user = "Costi"
>>> str(t1)
'Hallo Costi.'
>>> 
Oha, damit lässt sich ja einiges lustiges machen:

Code: Alles auswählen

t2 = Template("Hallo $user.")
t2.__dict__.update({'user' : 'Costi')
str(t2)

# oder noch was tolles:
t3 = Template("Hallo $__str__")
str(t3)
Naja, ich finde es ja nicht besonders berauschend die Templatevariablen als Attribute an die Klase zu binden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

Code: Alles auswählen

>>> from Cheetah.Template import Template
>>> t = Template("hello $user")
>>> t.user = t
>>> str(t)
:wink:

aber was ich eigentlich machen will klappt immer noch nicht:

Code: Alles auswählen

from Cheetah.Template import Template
def render(template, **namespace):
	assert not 'user' in namespace
	namespace['user'] = get_user()
	
	t = Template(file="/home/kirsch/Desktop/domino/templates/" + template + '.tmpl', searchList=[namespace] )
	
	#doppelt haelt besser
	for key, value in namespace.iteritems():
		setattr(t, key, value)

	return str(t)

Code: Alles auswählen

$ python Desktop/domino/templates/index.py
Traceback (most recent call last):
  File "Desktop/domino/templates/index.py", line 206, in <module>
    CmdLineIface(templateObj=index()).run()
  File "/var/lib/python-support/python2.5/Cheetah/TemplateCmdLineIface.py", line 44, in run
    print self._template
  File "/var/lib/python-support/python2.5/Cheetah/Template.py", line 993, in __str__
    def __str__(self): return getattr(self, mainMethName)()
  File "/home/kirsch/Desktop/domino/templates/base.py", line 275, in respond
    self.login(trans=trans)
  File "/home/kirsch/Desktop/domino/templates/base.py", line 173, in login
    if user.islogedin: # generated from line 47, col 2
NameError: global name 'user' is not defined
:cry: :cry: :cry: :cry: :cry: :cry:

ich glaub ich geh mal duschen, schlafen, was essen, und dan ein spaziergang....

ohh man, ne aber ich muss diese #$%^$ noch fertig kriegen[1]
und fuer die lan muss ich auch noch fit sein

HHHIIILLLFEEEE!!!!


[1] @ALLE erst machen, dan ankeundigen, nicht umgekehrt (-:
cp != mv
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

aua, ich rufe die template als standalone programm auf, da kan meine ``render`` die irgendwo anders liegt ausehen wie sie will

wie reden in 12 stunden weiter :lol:
cp != mv
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Tipp: "#doppelt haelt besser" stimmt so nicht. Es belegt unnötig Ressourcen und wenn es nicht nötig ist, sollte man so etwas vermeiden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ich hab den bug:
in meiner base.tmpl steht: ``if user.islogedin``
es muss aber lauten ``if $user.islogedin``

die variable ``user`` wurde schon sicher uebergeben, der fehler lag beim "empfangen"
cp != mv
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wie wäre es mit `isloggedin` als Attributname? Oder gar `is_logged_in` (Lesbarkeit/PEP 8 ftw)?

Ich muss da unweigerlich an das Direct Connect-Protokoll denken, dass einen Rechtschreibfehler als festen Bestandteil eines Befehls hat *schüttel*. Nix für mich.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Ich muss da unweigerlich an das Direct Connect-Protokoll denken, dass einen Rechtschreibfehler als festen Bestandteil eines Befehls hat *schüttel*.
Das ist gut :) Andererseits hat (E)SMTP die Befehle HELO und EHLO ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

HTTP hat doch auch einen Rechtschreibfehler im RFC das Teil jeder Implementierung ist :-)
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mitsuhiko hat geschrieben:HTTP hat doch auch einen Rechtschreibfehler im RFC das Teil jeder Implementierung ist :-)
Für alle die sich wundern was das wäre - es geht um "Referer" die etwa 1997 zum ersten mal erwähnt wurden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten