2011-05-31 13 views

risposta

5

Jinja2 utilizza effettivamente una classe speciale per le entità non definite. È possibile sottoclasse questa classe Undefined da Jinja2 per includere __getattr__ e altri attribute accessors che si desidera essere in grado di utilizzare anche su entità non definite e fare in modo che restituiscano una stringa unicode vuota (ad esempio).

+1

grazie molto utile po 'di informazioni –

+0

correlate: http://stackoverflow.com/questions/6182498/jinja2-how-to-make-it-fail-silently-like-djangotemplate/6192308 –

5

Partendo di risposta eccellente e disponibile di Sean, ho fatto la seguente:

from jinja2 import Undefined 
import logging 

class SilentUndefined(Undefined): 
    ''' 
    Dont break pageloads because vars arent there! 
    ''' 
    def _fail_with_undefined_error(self, *args, **kwargs): 
     logging.exception('JINJA2: something was undefined!') 
     return None 

e poi env = Environment(undefined=SilentUndefined) dove mi stava chiamando che.

Nella biblioteca django_jinja, che io uso, quanto sopra è in base.py e in realtà è una modifica del initial_params

2

ho costruito sulla risposta @ di Rattray sopra:

from jinja2 import Undefined, Template 

class SilentUndefined(Undefined): 
    def _fail_with_undefined_error(self, *args, **kwargs): 
     return '' 

poi utilizzato con stringa di modello :

person_dict = {'first_name': 'Frank', 'last_name': 'Hervert'} 
t2 = Template("{{ person1.last_name }}, {{ person.last_name }}", undefined=SilentUndefined) 

print t2.render({'person': person_dict})                   
# ', Hervert' 

Avevo bisogno di ignorare gli errori durante il rendering di un modello direttamente dalla stringa invece di usare Ambiente.

3

Avevo anche bisogno di resettare i metodi magici della classe per far sì che gli attributi degli oggetti funzionassero correttamente. Aggiunta a @rattray -

from jinja2 import Undefined, Template 

class SilentUndefined(Undefined): 
    def _fail_with_undefined_error(self, *args, **kwargs): 
     return '' 

    __add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \ 
     __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \ 
     __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \ 
     __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \ 
     __float__ = __complex__ = __pow__ = __rpow__ = \ 
     _fail_with_undefined_error   

Sarebbe sensato essere un ambiente jinja. Un sacco di gente verrebbe dai modelli di Django che sono silenziosi di default.

+0

Questa è l'unica variante di SilentUndefined che ha funzionato per me – Anton

1

Inoltre cercava una soluzione e utilizzava @ s29 SilentUndefined class, ma ho rilevato "l'oggetto" str "non è chiamabile" errore quando si cercava di chiamare la variabile non definita, quindi questa è la mia soluzione, potrebbe essere utile per qualcuno

class SilentUndefined(Undefined): 

    def _fail_with_undefined_error(self, *args, **kwargs): 
     class EmptyString(str): 
      def __call__(self, *args, **kwargs): 
       return '' 
     return EmptyString() 

__add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \ 
    __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \ 
    __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \ 
    __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \ 
    __float__ = __complex__ = __pow__ = __rpow__ = \ 
    _fail_with_undefined_error 
Problemi correlati