使用 Flask 数据生成 Javascript.坏主意

Using Flask data to generate Javascript. Bad idea?

本文关键字:Javascript Flask 数据 使用      更新时间:2023-09-26

在自学Flask的过程中,我已经养成了在一些模板中做这样的事情的习惯:

<script type="text/javascript">
{% for r in reviews %}
    $('#{{ r.review_id }}-starrating').raty({readOnly: true, score: {{ r.rating/100 * 5 }} });
{% endfor %}
</script>

当我第一次需要完成这样的事情时,我没有三思而后行。但是现在回到这段代码让我担心。这算不算不好的做法?我应该怎么做?

这是一个很好的问题,表明你已经对什么是好的/坏的编程有了一定的直觉。 做你所描述的事情并没有错:我的意思是它会起作用,而且对某些人来说效果很好。

但是,根据我的经验,虽然琐碎的事情很容易,但一旦应用程序变得冗长和繁忙,维护起来就会变得棘手。 我认为违反的编程原则被称为maintaining a separation of concerns。 问题是您正在编写的代码必须同时遵循两个范围:服务器和客户端;一次专注于一个总是更容易。

快速简化问题的一种方法是编写一个纯 javascript 例程,然后使用服务器生成的数据调用该例程。

这可能是这样的:

// a pure js function
function render_rating(elid, rating){
      $elid.raty({readOnly: true, score: rating/100 * 5})
}

并在其他地方整齐地列出所有调用:

<script type="text/javascript">
// server generates a list of function calls which render the ratings client side
{% for review in reviews %}
   render_rating('#{{review.id}}-starrating', {{review.rating}});
{% endfor %}
</script>

这个想法是将代码分成两个不同的片段,这样很明显"这是发生在客户端上的事情"和"这是发生在服务器上的事情"。

当javascript例程

变得冗长而复杂时(如ajax应用程序),这种想法使得创建静态(可缓存)javascript变得更加容易,这些JavaScript可以由嵌入到html中的服务器端生成的数据调用,并且随着事情变得更加先进,由其他js例程调用调用,这些js例程正在作用于ajax api调用返回的数据。