我想從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)
我已經最終使用** ** DebugUndefined和使用正則表達式'{{(。*?)}}'查找渲染模板中的缺失變量。然而,我會upvote爲您的答案,因爲它使用日誌記錄。謝謝。 – moth
感謝您的支持。使用make_logging_undefined的輸出在示例中都是未定義的變量。以下是輸出示例:警告:記錄器:模板變量警告:undefined_var1未定義# 警告:記錄器:模板變量警告:underfined_var2未定義 – Balitong