2017-10-07 27 views
0

我想從Jinja2模板中獲取所有未定義的變量。 假設我有一個如下所示的模板。如何從Jinja2模板中獲取所有未定義的變量?

tmpstr = """ 
{% for row in csv %} 
sample {{row.field1}} stuff {{row.field2}} morestuff {{row.field3}} 
{% endfor %} 
""" 

和輸入字典如下

cxt = {'csv': [ 
    {'field3': 1234, 'field4': 12314}, 
    {'field3': 2222, 'field4': 1213} 
]} 

這裏是我嘗試呈現它。

env = Environment(undefined=Undefined) 
tmp = env.from_string(tmpstr) 
tmpsrc = tmp.render(cxt) 
print(tmpsrc) 

模板期望變量field1,field2和field3存在。但是字段1字段2不存在。我的目標是找到所有缺失的變量。

Jinja2很少忽略缺少的變量。因此,我試圖添加StrictUndefined選項。

errs = [] 
try: 
    env = Environment(undefined=StrictUndefined) 
    tmp = env.from_string(tmpstr) 
    tmpsrc = tmp.render(cxt) 
except Exception as e: 
    errs.append(str(e)) 
print(errs) 

然而此時的Jinja2只能抱怨第一缺失變量這是FIELD1

因此我想另一種選擇是DebugUndefined 此選項不會產生異常,因此只有在模板輸出替換缺失變量。因此我不能收集缺失的變量。

你能建議我怎麼能在jinja2模板中缺少變量?

這裏是可運行的代碼,如果有人想嘗試一下

from jinja2 import BaseLoader,Environment,StrictUndefined,DebugUndefined,Undefined 
tmpstr = """ 
{% for row in csv %} 
sample {{row.field1}} stuff {{row.field2}} morestuff {{row.field3}} 
{% endfor %} 
""" 
cxt = {'csv': [ 
    {'field3': 1234, 'field4': 12314}, 
    {'field3': 2222, 'field4': 1213} 
]} 
env = Environment(undefined=Undefined) 
tmp = env.from_string(tmpstr) 
tmpsrc = tmp.render(cxt) 
print('CASE 1: undefined=Undefined') 
print(tmpsrc) 

errs = [] 
try: 
    env = Environment(undefined=StrictUndefined) 
    tmp = env.from_string(tmpstr) 
    tmpsrc = tmp.render(cxt) 
except Exception as e: 
    errs.append(str(e)) 
print('CASE 2: undefined=StrictUndefined') 
print(errs) 

errs = [] 
try: 
    env = Environment(undefined=DebugUndefined) 
    tmp = env.from_string(tmpstr) 
    tmpsrc = tmp.render(cxt) 
except Exception as e: 
    errs.append(str(e)) 

print('CASE 3: undefined=DebugUndefined') 
print(errs) 
print(tmpsrc) 

回答

2

我找到了解決您的問題,使用jinja2.make_logging_undefined。我和你在同一條船上,一直在尋找答案。大多數答案指出我使用解析模板,但我無法弄清楚如何將上下文放入解析模板中。

我終於可以使用make_logging_undefined進行這項工作。如果您想查找所有未定義的變量,請確保僅使用Undefined基類,而不是StrictUndefined。使用StrictUndefined會導致jinja在第一次遇到undefine時拋出異常。

只是一個免責聲明:我不是一個python也不是jinja專家,所以代碼不是最有效也不是結構化的。但它符合我的目的。這只是POC代碼。

下面的代碼:

import jinja2 
import logging 
from jinja2 import Environment, Undefined 
from jinja2.exceptions import UndefinedError 

def main(): 
    templateLoader = jinja2.FileSystemLoader(searchpath="D:\\somelocation\\") 

    logging.basicConfig() 
    logger = logging.getLogger('logger') 
    LoggingUndefined = jinja2.make_logging_undefined(logger=logger,base=jinja2.Undefined) 

    templateEnv = jinja2.Environment(loader=templateLoader, undefined=LoggingUndefined) 

    TEMPLATE_FILE = "./example1.jinja" 

    template = templateEnv.get_template(TEMPLATE_FILE) 

    FAVORITES = [ "chocolates", "lunar eclipses", "rabbits" ] 
    # Specify any input variables to the template as a dictionary. 
    templateVars = { "title" : "Test Example", 
        "description" : "A simple inquiry of function.", 
        "favorites" : FAVORITES, 
        "whatever" : "1" 
        }  
    # Finally, process the template to produce our final text. 
    try: 
     outputText = template.render(templateVars) 
    except (UndefinedError) as err: 
     print err 

if __name__ == '__main__': 
    main() 

example1.jinja:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" /> 

    <title>{{ title }}</title> 
    <meta name="description" content="{{ description }}" /> 
</head> 

<body> 

<div id="content"> 
    <p>Greetings visitor! These are a list of my favorite things:</p> 

    <ul> 
    {% for item in favorites %} 
    <li>{{ item }}</li> 

    <li>My favorites: {{ favorites[1] }} </li> 
    {% endfor %} 
    {{ undefined_var1 }} 
    {{ underfined_var2 }} 
    </ul> 
</div> 

</body> 
</html> 

這裏的示例輸出:

WARNING:logger:Template variable warning: undefined_var1 is undefined 
WARNING:logger:Template variable warning: underfined_var2 is undefined 
+0

我已經最終使用** ** DebugUndefined和使用正則表達式'{{(。*?)}}'查找渲染模板中的缺失變量。然而,我會upvote爲您的答案,因爲它使用日誌記錄。謝謝。 – moth

+0

感謝您的支持。使用make_logging_undefined的輸出在示例中都是未定義的變量。以下是輸出示例:警告:記錄器:模板變量警告:undefined_var1未定義# 警告:記錄器:模板變量警告:underfined_var2未定義 – Balitong