You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用变量名动态调用Flask宏?

动态调用Jinja2宏的优化方案

方法一:直接利用Jinja2模板上下文(推荐)

无需自定义装饰器,用字符串拼接+模块取值的方式替代冗长的if-elif链,更贴合Pythonic风格:

  1. 导入子宏文件
    在使用select_macro的模板顶部导入宏文件:
{% import 'child_macros.html' as child_macros %}
  1. 重构select_macro
    通过context.key动态生成宏名称,直接从导入的模块中获取并调用:
{% macro select_macro(context) %}
do stuff
{% set macro_name = 'macro_' ~ context.key %}
{# 可选:添加判断避免宏不存在的报错 #}
{% if macro_name in child_macros %}
    {{ child_macros[macro_name]() }}
{% else %}
    Default content or error message
{% endif %}
do more stuff
{% endmacro %}

调用宏时记得传入上下文:{{ select_macro(context) }}

方法二:修复@pass_context装饰器(适配app工厂)

如果坚持使用自定义装饰器,问题出在装饰器未适配app工厂的延迟加载特性,以下是正确实现:

在decorators.py中定义装饰器:

from functools import wraps
from flask import current_app

def pass_context(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        with current_app.app_context():
            # 将上下文传入被装饰函数
            return f(*args, context=current_app.app_context(), **kwargs)
    return wrapper

注意:Jinja2宏本身支持直接接收context参数,因此方法一的写法更简洁高效,无需额外Python层的装饰器。

内容的提问来源于stack exchange,提问作者grommit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:56:15