在 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>
我正在 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>