在金字塔中分离view_config路由和渲染

时间:2011-12-13 01:01:27

标签: python render pyramid

我正在尝试实现一种模式,我使用中间函数来确定要调用哪个函数并使最终函数执行渲染,但是流程不会最终呈现。我错过了什么?有没有办法调整它以使其工作?

这就是我正在尝试的事情。

@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 个答案:

答案 0 :(得分:4)

金字塔的渲染器非常简单,最后它只是“蟒蛇”。这意味着你从函数中调用函数,没什么特别的。

Pyramid的自动渲染工作方式是:

  1. 请求进来,被派遣到视图。
  2. 如果特定视图视图未返回Response对象,则Pyramid会尝试将您从视图返回的值传递给附加的渲染器。
  3. view_config仅与当前请求的视图相关。您调用的其他函数只是Python中的函数。

    如果您仍想将作品委托给另一个视图,那么有几个选项,但我们告诉别人的是您需要在子视图中明确调用pyramid.renderers.renderrender_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)
    

    每种方法都有明显的好处和警告。