在Pyramid中分离view_config路由和渲染
我正在尝试实现一个模式,想用一个中间函数来决定调用哪个函数,然后让最终的函数负责渲染,但结果并没有成功渲染出来。我可能漏掉了什么?有没有办法调整一下让它正常工作?
这是我正在尝试的内容。
@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的自动渲染工作原理是这样的:
- 请求进来后,会被分配到一个视图。
- 如果这个特定的视图没有返回一个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)
显然,每种方法都有其优缺点。