2011-06-25 25 views
2

使用的功能是它可以使用LOAD =(...)與函數而不是控制器/函數的字符串web2py的:在LOAD(阿賈克斯)

如:

Controller: 
def test(): 
    print "test" 

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

查看:

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

而不是:

查看:

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

主要原因是,我想使用lambda /生成的函數,這種方式無法訪問。

回答

4

不是因爲語法不被支持,因爲它在邏輯上是不可能的:LOAD()在一個不同的http請求中執行,而lambda將被執行,因此後者將是未定義的。而且爲了執行ajax回調,被調用函數必須有一個名字,不能是lambda。我們可以想出創造性地使用緩存,使LOAD存儲在緩存中的拉姆達:

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工作,並將需要定期清除緩存。

+0

感謝您清理此問題 – nehz