chr*_*kso 32 python templates decorator jinja2 flask
我的蓝图瓶应用程序周围的许多路线需要将"侧边栏数据"发送给jinja.
我正在寻找最有效的方法来做到这一点.它们必须比将'generate_sidebar_data()'函数导入每个蓝图更好,反复说:
var1, var2, var3 = generate_sidebar_data()
Run Code Online (Sandbox Code Playgroud)
然后使用'render_template'发送它们:
return render_template('template.html',
var1=var1,
var2=var2,
var3=var3
)
Run Code Online (Sandbox Code Playgroud)
我想要的是一个装饰器,我可以使用与上述相同的路径(运行函数并将变量发送给jinja),但我不知道这是否可行.如何从装饰器函数内部向jinja发送变量?
@blueprint.route('/')
@include_sidebar_data
def frontpage():
return render_template('template.html')
Run Code Online (Sandbox Code Playgroud)
whe*_*ies 24
我将提出比使用装饰器或模板方法或类似的东西更简单的东西:
def render_sidebar_template(tmpl_name, **kwargs):
(var1, var2, var3) = generate_sidebar_data()
return render_template(tmpl_name, var1=var1, var2=var2, var3=var3, **kwargs)
Run Code Online (Sandbox Code Playgroud)
是的,只是一个功能.这就是你真正需要的,不是吗?请参阅此 Flask Snippet获取灵感.它本质上是在不同的环境中做同样的事情.
tbi*_*icr 11
您可以使用上下文处理器(http://flask.pocoo.org/docs/api/#flask.Flask.context_processor):
def include_sidebar_data(fn):
@blueprint.context_processor
def additional_context():
# this code work if endpoint equals to view function name
if request.endpoint != fn.__name__:
return {}
var1, var2, var3 = generate_sidebar_data()
return {
'var1': var1,
'var2': var2,
'var3': var3,
}
return fn
@blueprint.route('/')
@include_sidebar_data
def frontpage():
return render_template('template.html')
Run Code Online (Sandbox Code Playgroud)
UPD:我更喜欢下一个例子,如果装饰器用于多个视图函数会更好:
sidebar_data_views = []
def include_sidebar_data(fn):
sidebar_data_views.append(fn.__name__)
return fn
@blueprint.context_processor
def additional_context():
# this code work if endpoint equals to view function name
if request.endpoint not in sidebar_data_views:
return {}
var1, var2, var3 = generate_sidebar_data()
return {
'var1': var1,
'var2': var2,
'var3': var3,
}
@blueprint.route('/')
@include_sidebar_data
def frontpage():
return render_template('template.html')
Run Code Online (Sandbox Code Playgroud)
您可以创建一个像这样的装饰器函数:
def include_sidebar_data(fn):
template_name = fn()
var1, var2, var3 = generate_sidebar_data()
def wrapped():
return render_template(template_name, var1=var2, var2=var2)
return wrapped
@blueprint.route('/')
@include_sidebar_data
def frontpage():
return 'template.html'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25831 次 |
最近记录: |