【问题标题】:Flask: passing multiple python based variables through render_template()Flask:通过 render_template() 传递多个基于 python 的变量
【发布时间】:2019-09-10 22:11:31
【问题描述】:

在尝试读取我在 python/a Flask 视图函数中创建的两个变量时,出现了非常令人沮丧的行为。

我有一个名为experiment.py 的python 程序。有一个路由到 POST 请求的函数,当有人提交表单时它会被执行。在该函数中,我试图返回两个变量:“user_id”包含生成的 user_id,“total_trials”实际上与用户在前一个表单上输入的试验次数相同。

我已经尝试了两种方法来返回这些变量。当前的方法是在 render_template() 中使用data 参数,并将这些变量填充到字典中。

@bp.route('/experiment_app', methods=['GET', 'POST'])
def exp_js_psych_app():
total_trials = int(request.form['trials'])
import random 
import string 

# Generate a random string 
# with 8 characters. 
user_id = ''.join([random.choice(string.ascii_letters 
            + string.digits) for n in range(8)]) 
user_id = str(user_id)
generate_stim_for_trials(total_trials, user_id)
return render_template("index.html", data={"user_id": str(user_id), "total_trials":total_trials})
#return render_template("index.html", user_id=user_id, total_trials=total_trials) # also tried to merely just return both variables individually

所以我试图将这两个变量都放入 index.html 上的一些内联 javascript 中。这是代码。

    <!DOCTYPE html>
<html>
<head>
    <title>My experiment</title>
    <script type="text/javascript">

        // var trial_total = {{ total_trials }};
        var trial_total = {{ data.total_trials }};
        console.log(trial_total);

        // var user_id = {{ user_id }};
        var user_id = String( {{ data.user_id }} ) ;
        console.log("USER ID HTML");
        console.log(user_id);
     </script>
</head>
<body></body>
</html>

你可以看到我已经注释掉了

我能够在这两种方法中成功提取total_trials 变量,没问题。

问题来自 user_id。不管我做什么...... {{ data.user_id }}{{ user_id }} 实际上确实返回了在 python 中生成的字符序列。但问题是这些字符序列不在字符串中/没有引号,它们只是像变量名一样出来。因此,如果 python 应用程序中的 user_id 设置为字符串“12345678”,那么在 Javascript 中,当我使用 Jinja 语法引用 user_iddata.user_id 时,我只会得到 12345678,这通常会触发“无法识别的变量” " 错误。

这是我使用检查元素的屏幕截图(试图检查控制台)来说明我的意思

如果我尝试使用String,我只会得到以下信息:var user_id = String(6z9dVPpG);

那么...这里有什么问题?

请注意,如果我尝试{{ data.user_id|string }},我的控制台中仍然会出现与屏幕截图中相同的内容。

【问题讨论】:

    标签: javascript python flask jinja2


    【解决方案1】:

    叹息

    我不知道为什么它会这样工作,但是...var user_id = "{{ data.user_id|string }}"; 工作。所以用引号将表达式括起来。

    使用 Jinja 表达式引用字符串时是否需要引号?

    【讨论】:

    • 我相信你也可以| tojson。这些数据被逐字插入模板中,因此它们必须是有效的 JavaScript 代码。用引号括起来就是这样!
    • 谢谢!这澄清了。早些时候我还没有完全意识到我已经将我寻找的“多个变量”编码为一个 json 对象/字典,最好使用 | tojson 在 javascript 中进行解析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2017-04-03
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多