在 Jinja2 中处理 TypeError 的正确方法是什么

What is the proper way to handle TypeError in Jinja2

我正在 jinja2 模板中做一些简单的计算(减法),想找到一个解决方案来处理 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" 异常,但它不起作用。

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)   

乍一看,将计算函数移出 Jinja 并保留在 Python 中听起来更合乎逻辑,也更符合 Jinja2 的行情。

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>