我正在使用(优秀的)Python 构建网站 Flask framework其中有一个 templates/
文件夹和一个 static/
文件夹。顾名思义,templates 文件夹包含通过 jinja2 templating engine 渲染的模板。 static 文件夹包含静态内容,例如 css、图像和静态 javascript 文件。
javascript 文件是我遇到的问题。有时我想在一段 js 中放置一个 jinja 变量,例如:
var requestJson = {'text': messageText, 'toUserId': {{ user.id }}};
如果我在 .js
中执行此操作文件在 static/
文件夹,它不会被渲染,所以只有当我把它放在 <script>
之间时才有效。模板文件中的标签。这行得通,但感觉有点乱,因为我现在在静态文件夹中有一些 js,在模板文件中有一些 js。
我当然可以通过定义 document.toUserId = {{ user.id }};
来解决这个问题在模板中并在 .js 文件中使用它,但是,是的,这也有点像 hack。
所以我的问题是;在 javascript 中处理从 jinja 插入动态值的最佳/pythonic/最简洁的方法是什么?
最佳答案
非常有趣的问题,我在某个时间点思考了很多。到目前为止,我已经做到了,并且看到它正是以这种方式完成的,在我看来,这是最好和最 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>
它工作得非常好,在几个项目之后,其中一些已经存在了很长一段时间,有很多人参与,我可以说它是完全可读和可维护的。请谨慎明智地选择您的命名空间。
关于javascript - 如何在 Flask 中构造动态 javascript 创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27505704/