2016-05-31 3 views
0

Я делаю несколько простых вычислений в шаблоне jinja2 (вычитание) и хотел бы найти решение для обработки TypeErrors в Jinja2.Что такое правильный способ обработки TypeError в Jinja2

Это то, что я пробовал до сих пор: чтобы игнорировать недоступные переменные во время рендеринга, я подклассифицировал Undefined() как таковой.

def silently(*args, **kwargs): 
    return u'' 

return_new = lambda *args, **kwargs: SilentUndefined() 

class SilentUndefined(Undefined): 
    __unicode__ = silently 
    __str__ = silently 
    __call__ = return_new 
    __getattr__ = return_new 

Этот подход работает большую часть времени, за вычетам, например, за исключением:

Traceback (most recent call last): 
File "runScheduler.py", line 108, in <module> 
dataFetcher.fetchData(**kwargs) 
"/Fetcher/modules/dataFetcher.py", line 836, in fetchData 
hmgReport.send_email(emailSubject,emailSender,emailRecipients,attachementFiles, context, 'reportTemplates/'+emailTemplate) 
     File "/Fetcher/modules/reportEngine.py", line 190, in send_email 
     print t.render(c) 
     File "/usr/local/lib/python2.7/dist-packages/jinja2/environment.py", line 969, in render 
     return self.environment.handle_exception(exc_info, True) 
     File "/usr/local/lib/python2.7/dist-packages/jinja2/environment.py", line 742, in handle_exception 
     reraise(exc_type, exc_value, tb) 
     File "<template>", line 890, in top-level template code 
    TypeError: unsupported operand type(s) for -: 'SilentUndefined' and 'int' 

Я думал, что я мог бы просто игнорировать «TypeError» Exception как таковой, но это не работает ,

class TypeError(): 
    pass 

Это, как я делаю рендеринг ...

with open (reportEmailTemplate, "r") as myfile: 
    reportEmailTemplateHTML = myfile.read()  
    #apply context to coverpage 
    t = Template(reportEmailTemplateHTML, undefined=SilentUndefined) 
    renderedReportEmailTemplate = t.render(context) 

ответ

0

В первом приближении, это звучит более логично и более линий Jinja2, чтобы переместить функции расчета из Джиндже и держать их в Python.

def some_simple_calculation(*args, **kwargs): 
    # handle errors here 

t = Template(reportEmailTemplateHTML) 
t.globals['some_simple_calculation'] = some_simple_calculation 

renderedReportEmailTemplate = t.render(context) 

И в шаблоне

<div>{{ some_simple_calculation(arg1, arg2) }}</div> 
+0

Я немного ленивый и предпочел бы просто игнорировать этот тип ошибки. Это возможно? – Jabb

+0

Насколько я знаю, намеренно невозможно обрабатывать исключения, происходящие внутри шаблонов Jinja, и я думаю, что это очень хорошо. Ваш код, вероятно, требует немного большей структуризации перед шагом шаблонов. Вы пытаетесь бороться с шаблоном двигателя, чтобы компенсировать то, что, вероятно, незначительное упущение на несколько шагов раньше. Продолжайте лениться, просто положите свою лень в нужное место;) – Jivan

+0

ну ... вы правы :-)) Спасибо! – Jabb

Смежные вопросы