【问题标题】:How to structure dynamic javascript creation in Flask?如何在 Flask 中构建动态 javascript 创建?
【发布时间】:2014-12-16 13:24:52
【问题描述】:

我正在使用(优秀的)Python Flask framework 构建一个网站,其中有一个 templates/ 文件夹和一个 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 文件中使用它来解决这个问题,但是,是的,这也有点像 hack。

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

【问题讨论】:

    标签: javascript python templates flask jinja2


    【解决方案1】:

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

    它工作得非常好,经过几个项目,其中一些项目已经存在了相当长一段时间,涉及到很多人,我可以说它完全可读和可维护。请注意明智地选择命名空间。

    【讨论】:

    • 为了获得额外的好处,请使用 requirejsbrowserify 来提供对代码的依赖,而不是全局变量(您仍然需要将包的声明放在模板中) - 然后在您的代码中,您只需在消费代码中 var pageConfig = require('pageConfig') 并访问您需要的变量。
    猜你喜欢
    • 2011-05-17
    • 2021-02-23
    • 1970-01-01
    • 2011-02-23
    • 2011-07-24
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多