PAYATHON 2026

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 简化为只包含模板名的一行调用,再逐项加回参数。如果简化后可以正常使用,问题就出在跨行表达式或某个参数的语法上。

备注:内容仅供参考。