web2py:在LOAD中使用函数(ajax)

时间:2011-06-25 03:24:14

标签: ajax load web2py

是否可以使用带有函数的= LOAD(...)而不是控制器/函数字符串

e.g:

Controller:
def test():
    print "test"

def index():
    return dict(test=test)

查看:

{{=LOAD(test, ajax=True)}}

而不是:

查看:

{{=LOAD('controller', 'test', ajax=True)}}

主要原因是,我想使用无法以这种方式访问​​的lambda / generated函数。

1 个答案:

答案 0 :(得分:4)

没有。但不是因为语法不受支持,因为它在逻辑上是不可能的:LOAD()在与执行lambda的http请求不同的http请求中执行,因此后者将是未定义的。而且为了执行ajax回调,被调用的函数必须有一个名字,不能是一个lambda。我们可以创建一个缓存的创造性使用,以便LOAD将lambda存储在缓存中:

def callback():
    """ a generic callback """
    return cache.ram(request.args(0),lambda:None,None)(**request.vars)

def LOAD2(f,vars={}):
    """ a new load function """
    import uuid
    u = str(uuid.uuid4())
    cache.ram(u,lambda f=f:f,0)
    return LOAD(request.controller,'callback',args=u,vars=vars,ajax=True)

def index():
    """ example of usage """
    a = LOAD2(lambda:'hello world')
    return dict(a=a)

但这只适用于cache.ram,需要定期缓存清理。