Разделение маршрутизации и рендеринга view_config в Pyramid - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь реализовать шаблон, в котором я использую промежуточную функцию, чтобы определить, какую функцию вызывать, а финальная функция выполняет рендеринг, но поток не заканчивается рендерингом. Что мне не хватает? Есть ли способ настроить это, чтобы он работал?

Вот что я пытаюсь сделать.

@view_config(route='fork_route')
def fork(self):
    x = True
    if x:
        self.my_func1
    else:
        self.my_func2
    #I expected it to render before this point
    return dict({'msg':'failed'})

@view_config(renderer="templates/derived/template1")
def my_func1:
    return dict({'msg':'msg1'})

@view_config(renderer="templates/derived/template2")
def my_func2:
    return dict({'msg':'msg2'})

1 Ответ

4 голосов
/ 13 декабря 2011

Средства визуализации Pyramid довольно просты, и, в конце концов, это «просто python» То есть вы вызываете функции из функций, ничего особенного.

Способ автоматического рендеринга Pyramid работает так:

  1. Запрос приходит, отправляется на просмотр.
  2. Если это конкретное представление представление НЕ возвращает объект Response, то Pyramid пытается передать значение, которое вы вернули из представления, во вложенный рендер.

view_config относится только к представлению текущего запроса. Другие функции, которые вы вызываете, это просто функции в Python.

Если вы все еще хотите делегировать работу другому представлению, есть несколько вариантов, но один из них, который мы сообщаем людям, заключается в том, что вам нужно будет явно вызвать pyramid.renderers.render в пределах подвида или render_to_response. Конечно, если вы вызываете только render, вы должны превратить это HTML-тело в полный Response объект.

def fork(request):
    return myfunc1(request)

def myfunc1(request):
    return render_to_response('templates/derived/template2', {'msg': 'msg1'}, request)

Обратите внимание, как myfunc1 возвращает объект Response, поэтому fork (представление, которое активно для этого запроса) может просто вернуть его.

В противном случае вам нужно превратить результат в ответ:

def fork(request):
    resp = request.response
    resp.body = myfunc1(request)
    return resp

def myfunc1(request):
    return render('templates/derived/template2', {'msg': 'msg1'}, request)

Очевидно, что у каждого подхода есть свои преимущества и недостатки.

...