我目前在让javascript和python在web2py中进行通信时遇到问题。
Controller :
def testDB():
a=[]
a.append('a')
a.append('b')
a.append('c')
return dict(m=a)
(最终,它将替换为数据库行的数组)
目前,我正在尝试将m中的值分配给javascript中的数组。我已经尝试了几种方法:
var t="{{=m}}";
返回约43个无意义的字符。然后我尝试了:
var t= new Array(); var i=0;"{{q=0}}"
"{{i=len(message)}}"
i="{{=i}}";
for(q=0;q<i;q++,"{{q=q+1}}"){
t[q]="{{m[q]}}";
}
失败是因为python q变量每次循环都会重置,这是我问题的核心。
我也尝试使用pop:
for(q=0;q<i;q++,"{{q=q+1}}"){
alert("{{m.pop()}}");
}
但是数组会在循环开始时再次重置,因此它始终显示相同的变量。
有没有更简单的方法来复制数组,或者停止python变量重置,或者甚至只是将javascript q变量插入“{{m [q]}}””?
从我发现的问题来看,问题出在python是服务器端,所以您不能将javascript值分配给它的变量,但是我不确定这与它的循环部分有什么关系(如果我也这样做的话)在循环外,这些值不会重置)。常见的解决方案似乎是使用ajax或json,但如果可能的话,我想避免这种情况。谢谢
最佳答案
在web2py(或任何服务器端模板语言)中,您无法以自己的方式将服务器端Python代码与客户端Javascript代码混合使用。当请求该页面时,将评估web2py View 中的Python,并生成一个纯HTML页面(包括Javascript代码)并将其返回到浏览器。浏览器无法获取任何Python代码,也无法执行Javascript和Python的混合代码。
仅当您具有{{=some_value}}
(请注意等号)时,web2py View 才会在页面中插入文本/代码。因此,{{m[q]}}
之类的东西无效。如果要查看浏览器从web2py接收的内容,请查看浏览器中的页面源-它会向您显示 View 生成的HTML / Javascript的最终结果。
对于您的特定问题,您可以使用response.json()
将Python列表转换为JSON对象。但是,如果在 View 中按原样包含它,它将转义所有引号,因此必须将其传递给 XML()
helper以避免转义。像这样:
var t = {{=XML(response.json(m))}}