如何在web2py中无刷新获取服务器更新数据

1 投票
1 回答
1895 浏览
提问于 2025-04-17 05:10

我在一个web2py应用中做了搜索框功能,可以从数据库中获取结果。不过,如果在页面打开的时候数据库的内容发生了变化,就需要重新加载页面才能看到更新后的内容。

我想知道怎么能在不重新加载页面的情况下,通过ajax或json等方式,把数据库的内容读到javascript变量里。

目前我使用了一个控制器,代码如下:

def testDB():
        valA=[]
        valB=[]
        valC=[]
        for x in db().select(db.products.ALL):
            valA.append(x.prdA)
            valB.append(x.prdB)
            valC.append(x.prdC)
        return dict(VA=valA, VB=valB, VC=valC)

然后在视图中这样获取数据:

{{valA=VA}} {{valB=VB}} {{valC=VC}}
A = {{=XML(response.json(valA))}}
B = {{=XML(response.json(valB))}}
C = {{=XML(response.json(valC))}}

这样可以使用变量。这个方法在页面加载时获取的数据是没问题的,但如果数据库有变化,就不会自动更新。为了获取新的数据,我尝试了:

function loadFromDB(){
jQuery.ajax({
type:"POST",
    url:'testDB',
    success: function(msg){      
    {{
    valA=VA
    valB=VB
    valC=VC
    }}
    A = {{=XML(response.json(valA))}}
    B = {{=XML(response.json(valB))}}
    C = {{=XML(response.json(valC))}}
    },
    error: function(errormessage){alert("Error in retrieving from database");}
 });}

但是这似乎还是在使用旧的VA/B/C变量,因为它没有反映数据库的任何变化。我还尝试了其他一些方法,比如在{{}}括号外使用A=VA,但还没有找到有效的解决方案。我应该怎么把python函数返回的数据获取到javascript中呢?

谢谢

1 个回答

0

假设你的 loadFromDB 函数是在 testDB 这个视图里定义的,那么在 loadFromDB 中的 {{ }} 里的内容会在调用 testDB 时,页面最初创建的时候就被填充好。web2py 的模板代码并不是在用户的浏览器里执行的,而是在服务器上生成初始的 Javascript(也就是页面最开始加载的时候)。

如果你想让 loadFromDb 对 Ajax 调用返回的数据进行处理,你就需要用 Javascript 来写逻辑。需要注意的是,jQuery.ajax 的 success 函数会把返回的数据作为第一个参数传入,所以可以这样写:

jQuery.ajax({
    [snip]
    success: function(data) {
        [JS code to do something with the returned data]
    },
    etc.

撰写回答