Python - Flask:如何在渲染之前分配变量?

时间:2017-09-19 06:44:16

标签: python variables flask template-engine

我一直在寻找在渲染之前分配变量但没有找到任何内容的方法。

在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)

2 个答案:

答案 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)