Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Flask中构造动态javascript创建?_Javascript_Python_Templates_Flask_Jinja2 - Fatal编程技术网

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

如何在Flask中构造动态javascript创建?,javascript,python,templates,flask,jinja2,Javascript,Python,Templates,Flask,Jinja2,我正在使用(优秀的)Python构建一个网站,其中有一个templates/文件夹和一个static/文件夹。顾名思义,templates文件夹包含通过呈现的模板,而静态文件夹包含静态内容,如css、图像和静态javascript文件 javascript文件是我遇到的问题。有时我想在一段js中放置一个jinja变量,例如: var requestJson = {'text': messageText, 'toUserId': {{ user.id }}}; 但是,如果我在静态文件夹中的.js

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

javascript文件是我遇到的问题。有时我想在一段js中放置一个jinja变量,例如:

var requestJson = {'text': messageText, 'toUserId': {{ user.id }}};
但是,如果我在
静态
文件夹中的
.js
文件中执行此操作,它不会被渲染,因此仅当我将其放置在模板文件中的
标记之间时,此操作才有效。这是可行的,但感觉有点混乱,因为我现在在静态文件夹中有一些js,在模板文件中有一些js

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


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

非常有趣的问题,我在某个时间点上思考了很多。到现在为止,我已经做到了,并且看到了它正是这样做的,在我看来,这是最好的、最具蟒蛇风格的选择。我想我还记得Flask文档甚至推荐了它(不记得在哪里)

只需使用适当的名称空间,将需要模板呈现的特定变量放入
.html
文件中的脚本中

以及
.js
文件中的所有其他内容(我碰巧在使用CoffeeScript,因此出于一致性原因,我更需要将
标记中尽可能少的代码直接放在模板中)

例如,下面是一个(稍微修改过的)脚本,它位于我当前使用的模板的末尾:

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

$(函数(){
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}}”;
$(文档).ready(函数(){
$(“选择仪表板日期预设”).val({preset}”);
my_namespace.update_dashboard_dates_interval();
});
});

它运行得非常好,经过几个项目,其中一些项目已经存在了相当长一段时间,有很多人参与,我可以说它是完全可读和可维护的。只是要小心明智地选择名称空间。

为了增加额外的好处,请使用
requirejs
browserify
为代码提供依赖关系,而不是全局变量(您仍然需要将包的声明放在模板中),然后在代码中只需
var pageConfig=require('pageConfig')
在消费代码中,访问所需的变量。