在Pyramid中分离view_config路由和渲染

1 投票
1 回答
758 浏览
提问于 2025-04-17 08:15

我正在尝试实现一个模式,想用一个中间函数来决定调用哪个函数,然后让最终的函数负责渲染,但结果并没有成功渲染出来。我可能漏掉了什么?有没有办法调整一下让它正常工作?

这是我正在尝试的内容。

@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

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)

显然,每种方法都有其优缺点。

撰写回答