2016-05-31 33 views
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) 

答えて

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

関連する問題