Bottle SimpleTemplate 如何处理多行 % include 调用?
数据小许
结论
% include(...) 后的内容会按 SimpleTemplate 的模板语法解析。如果像问题中的写法那样,在 % include('collapsible_panel', 后直接换行,再把参数写在后续模板行中,解析器不会自动将这些行合并为一个完整的 Python 调用,因此会报 SyntaxError: '(' was never closed。复杂参数可以先在视图函数中组装,再传给模板;模板中只保留一行 include 调用。
推荐做法:在视图函数中准备参数
可以在视图层准备表格数据、嵌套模板的渲染结果等复杂值,再传入模板上下文。例如:
panel_args = {
'panel_width': '300px',
'collapsed': False,
'panel_content': template('panel_list',
headers=['ID', 'Name', 'Department', 'Active'],
column_widths='60px 1fr 120px 80px',
items=items,
),
'main_content': main_content,
}
return template('employees', panel_args=panel_args)
这里的 items 和 main_content 由应用现有逻辑提供。然后在 employees.tpl 中调用:
% include('collapsible_panel', **panel_args)
这样,模板中的调用完整地写在一行里,复杂的数据结构也不会被逐行解析拆开。
其他可选方式
如果不调整视图层,也可以把整个调用写在同一条 % 指令中。不过,问题中的参数和 HTML 内容较长,这样写不易阅读,也更容易出错。还可以先在视图函数中拆分并命名参数,再传给模板,避免把大段字典和嵌套调用直接放进模板指令。
排查时,可以先将 include 简化为只包含模板名的一行调用,再逐项加回参数。如果简化后可以正常使用,问题就出在跨行表达式或某个参数的语法上。
备注:内容仅供参考。
