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

我正在使用(出色的)Python Flask framework构建网站,其中有一个template /文件夹和一个static /文件夹.顾名思义,templates文件夹包含通过jinja2 templating engine呈现的模板,而static文件夹则包含诸如css,图像和静态javascript文件之类的静态内容.

javascript文件是我遇到的麻烦.有时我想在这样的js中放置一个jinja变量,例如:

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

但是,如果我在static /文件夹中的.js文件中执行此操作,则不会呈现它,因此仅当我将它放在< script>模板文件中的标签.可以,但是感觉有点混乱,因为我现在在静态文件夹中有一些js,在模板文件中有一些js.

我当然可以通过定义document.toUserId = {{user.id}};来解决此问题.在模板中并在.js文件中使用它,但是是的,这也有点像黑客一样.

所以我的问题是;什么是最好的/ pythonic /最近的方法来处理从javascript jinja动态值的插入?

解决方法:

这是一个非常有趣的问题,我在某个时间点已经考虑了很多.到目前为止,我已经做到了,并且已经看到它正是以这种方式完成的,对我来说,这似乎是最好,最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>

它确实运行良好,经过几个项目,其中一些项目已经存在了很多,涉及到很多人,我可以说它是完全可读和可维护的.请小心选择明智的名称空间.

上一篇:c-使用std :: is_same在if语句中访问类成员


下一篇:c-类定义中的模板专门化