2011-05-31 20 views

Respuesta

5

Jinja2 utiliza realmente una clase especial para entidades no definidas. Puede subclase esta clase Undefined de Jinja2 para incluir __getattr__ y otros attribute accessors que desee poder usar incluso en entidades no definidas y hacer que devuelvan una cadena de caracteres unicode en blanco (por ejemplo).

+1

gracias bits muy útil de información relacionada –

+0

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

5

Construido a partir excelente y útil respuesta de Sean, hice lo siguiente:

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 

y luego env = Environment(undefined=SilentUndefined) donde yo estaba llamando a eso.

En la biblioteca django_jinja, que yo uso, lo anterior está en base.py y es en realidad una modificación de initial_params

2

que construyeron sobre la respuesta de @ rattray arriba:

from jinja2 import Undefined, Template 

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

A continuación, se utiliza con cadena de plantilla :

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' 

Necesitaba ignorar los errores al representar directamente una plantilla desde una cadena en lugar de utilizar el entorno.

3

También necesité restablecer los métodos mágicos de la clase para hacer que los atributos de los objetos funcionen correctamente. Agregando 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   

Tendría sentido ser una configuración de jinja. Mucha gente vendría de plantillas django que son silenciosas por defecto.

+0

Esta es la única variante de SilentUndefined que funcionó para mí – Anton

1

También estaba buscando una solución y usé la clase @ s29 SilentUndefined, pero he detectado el error "'str' object no se puede llamar" cuando se intentó llamar a la variable indefinida, esta es mi solución, podría ser útiles para alguien

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 
Cuestiones relacionadas