0
jinja2テンプレート(減算)で簡単な計算を行い、Jinja2のTypeErrorsを処理するソリューションを探したいと考えています。Jinja2でTypeErrorを処理する適切な方法
これはこれまで私が試したことです:レンダリング中に使用できない変数を無視するために、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)
私は少し怠け者だとちょうどこのタイプのエラーを無視することを好むだろう。これは可能ですか? – Jabb
私の知る限りでは、Jinjaテンプレート内で起こっている例外を意図的に処理することは不可能であり、それはとても良いことだと思います。あなたのコードはおそらく、テンプレート化のステップに先立ってもう少し構造化を要求します。テンプレートエンジンとの戦いを試みて、おそらくほんの少し前の段階で軽微な欠落を補うことになります。あなたの怠惰を正しい場所に置いてください。) – Jivan
あなたは正しいです:-))ありがとう! – Jabb