如何在Flask中构建动态javascript创建?

时间:2014-12-16 13:24:53

标签: javascript python templates flask jinja2

我使用(优秀)Python Flask framework构建网站,其中有templates/文件夹和static/文件夹。顾名思义,templates文件夹包含通过jinja2 templating engine呈现的模板,静态文件夹包含静态内容,如css,图像和静态javascript文件。

javascript文件是我遇到的麻烦。有时候我想把jinja变量放在像这样的js中,例如:

var requestJson = {'text': messageText, 'toUserId': {{ user.id }}};

如果我在.js文件夹中的static/文件中执行此操作,但它不会被渲染,所以只有在{{1}之间放置它时才有效模板文件中的标签。这样可行,但感觉有点乱,因为我现在在静态文件夹中有一些js,在模板文件中有一些js。

我当然可以通过在模板中定义<script>并在.js文件中使用它来解决这个问题,但是,这也感觉有点像黑客。

所以我的问题是;在javascript中处理jinja动态值插入的最佳/ pythonic /最新方法是什么?

1 个答案:

答案 0 :(得分:3)

非常有趣的问题,我在某个时间点已经考虑了很多。到现在为止,我已经完成了它并且看到它正是以这种方式完成的,在我看来它是最好和最pythonic的选择。我想我甚至可以回想起Flask文档推荐它(不记得在哪里)。

使用适当的命名空间,将需要模板渲染的特定变量放在.html文件的脚本中。

所有其他文件都放在.js文件中(我碰巧使用的是CoffeeScript,因此对于我来说,将<script>标记中的最少代码直接放在模板中更为重要,出于一致性原因)。

例如,这是一个(略微修改过的)脚本,位于我目前正在使用的模板的末尾:

<script>
  $(function() {
    window.my_namespace.view_dashboard_vars = {};
    window.my_namespace.view_dashboard_vars.change_widgets_positions_url = "{{ url_for('dashboard.change_widgets_order', _external=True) }}";
    window.my_namespace.view_dashboard_vars.deactivate_widget_url = "{{ url_for('dashboard.deactivate_widget', _external=True) }}";
    window.my_namespace.view_dashboard_vars.dashboard_url = "{{ url_for('dashboard.view_dashboard', dashboard_id=dashboard.id, _external=True) }}";
    window.my_namespace.view_dashboard_vars.dashboard_id = "{{ dashboard.id }}";
    $(document).ready(function() {
        $("select#dashboard_dates_presets").val("{{ preset }}");
        my_namespace.update_dashboard_dates_interval();
    });
  });
</script>

它运作得很好,经过几个项目,其中一些项目现在已经存在很多,涉及到很多人,我可以说它具有完美的可读性和可维护性。请注意明智地选择名称空间。