使用 Flask 数据生成 Javascript。馊主意?
Using Flask data to generate Javascript. Bad idea?
在自学 Flask 的过程中,我养成了在我的一些模板中做这样的事情的习惯:
<script type="text/javascript">
{% for r in reviews %}
$('#{{ r.review_id }}-starrating').raty({readOnly: true, score: {{ r.rating/100 * 5 }} });
{% endfor %}
</script>
当我第一次需要完成这样的事情时,我没有三思而后行。但是现在回到这段代码让我担心。这被认为是不好的做法吗?我应该怎么做呢?
这是一个很好的问题,表明您已经对什么是 good/bad 编程有了一些直觉。按照您的描述进行操作并没有错:我的意思是它会起作用,并且对某些人来说效果很好。
但是,根据我的经验,虽然琐碎的事情很容易,但一旦应用程序变长且繁忙,维护起来就会很棘手。我认为违反的编程原则称为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>
想法是将代码分成两个不同的片段,这样就清楚了"this is stuff that happens on the client","this is stuff that happens on the server"。
当 javascript 例程变得又长又复杂(如 ajax 应用程序)时,这种思维方式使得创建可调用的静态(可缓存)javascripts 变得容易得多由服务器端生成的数据嵌入到 html 中,并且随着事情变得更高级,由其他 js 例程调用,这些例程作用于 ajax api 调用返回的数据。
在自学 Flask 的过程中,我养成了在我的一些模板中做这样的事情的习惯:
<script type="text/javascript">
{% for r in reviews %}
$('#{{ r.review_id }}-starrating').raty({readOnly: true, score: {{ r.rating/100 * 5 }} });
{% endfor %}
</script>
当我第一次需要完成这样的事情时,我没有三思而后行。但是现在回到这段代码让我担心。这被认为是不好的做法吗?我应该怎么做呢?
这是一个很好的问题,表明您已经对什么是 good/bad 编程有了一些直觉。按照您的描述进行操作并没有错:我的意思是它会起作用,并且对某些人来说效果很好。
但是,根据我的经验,虽然琐碎的事情很容易,但一旦应用程序变长且繁忙,维护起来就会很棘手。我认为违反的编程原则称为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>
想法是将代码分成两个不同的片段,这样就清楚了"this is stuff that happens on the client","this is stuff that happens on the server"。
当 javascript 例程变得又长又复杂(如 ajax 应用程序)时,这种思维方式使得创建可调用的静态(可缓存)javascripts 变得容易得多由服务器端生成的数据嵌入到 html 中,并且随着事情变得更高级,由其他 js 例程调用,这些例程作用于 ajax api 调用返回的数据。