web2py: использование функции в LOAD (ajax) - PullRequest
2 голосов
/ 25 июня 2011

Можно ли использовать = LOAD (...) с функцией, а не с контроллером / строкой функции

например:

Controller:
def test():
    print "test"

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

Просмотр:

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

а не:

Вид:

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

Основная причина в том, что я хочу использовать лямбда / сгенерированные функции, к которым невозможно получить доступ таким образом.

1 Ответ

4 голосов
/ 25 июня 2011

Нет.Но не потому, что синтаксис не поддерживается, потому что это логически невозможно: LOAD () выполняется в запросе http, отличном от того, в котором будет выполняться лямбда, и, следовательно, последний будет неопределенным.Более того, для выполнения обратного вызова ajax вызываемая функция должна иметь имя, которое не может быть лямбда-выражением.Мы могли бы придумать креативное использование кеша, чтобы 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 и потребует периодической очистки кеша.

...