我一直在寻找在渲染之前分配变量但没有找到任何内容的方法。
在PHP中,我可以在渲染模板之前单独在任何函数中执行此操作,我需要的只是$tpl
对象:
$tpl->assign('a', $a);
$tpl->output(...);
因此很难处理@app.route
之外的返回输出或使用Flask将变量赋值给模板
例如,如果用户启用了javascript,我想处理消息报告(返回或赋值变量),如果用户执行ajax请求,则返回json字符串,如果不是,则将变量赋值给模板。
这是我的代码
@admin.route('/login')
def login():
...
if form.validate_on_submit():
return helper.msg_report(...)
return render_template('login.pug', **locals())
def msg_report(ajax, type, msg):
if not ajax:
# need to assign msg variable to template here
else:
res = dict()
res['error'] = dict()
res['error']['message'] = mark_msg('error', msg)
return json.dumps(res)
答案 0 :(得分:0)
您分配给模板的变量在您的示例中为**locals()
。
例如,假设模板中有一个名为text
的变量。您可以按return render_template('login.pug', text="what you want")
分配。
因此,您只需要返回result = msg_report(ajax, type, msg)
,然后return render_template('login.pug', **result)
等词典。
答案 1 :(得分:0)
您可以在msg_report
中返回回复。
当form.validate_on_submit
真实时,仅更新模板上下文将返回None
。即
没有回复将被退回给客户。
from flask import jsonify, render_template
...
def msg_report(ajax, type, msg, **ctx): # pass variables needed by template here
if not ajax:
# update ctx before passing here
ctx.update({'error': msg})
return render_template('login.pug', **ctx)
rv = {
'error': {
'message': mark_msg('error', msg)
}
}
return jsonify(rv)
如果您仍想继续更新模板上下文,可以使用:
from flask import current_app as app
ctx = {
'error': msg
}
app.update_template_context(ctx)