【问题标题】:Separating view_config routing and rendering in Pyramid在 Pyramid 中分离 view_config 路由和渲染
【发布时间】:2012-01-18 23:09:57
【问题描述】:

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

这就是我正在尝试的。

@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'})

【问题讨论】:

    标签: python render pyramid


    【解决方案1】:

    Pyramid 的渲染器非常简单,最终它“只是 python”。意思是你从函数中调用函数,没什么特别的。

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

    1. 请求进来,被分派到一个视图。
    2. 如果 该特定视图 视图未返回 Response 对象,则 Pyramid 会尝试将从视图返回的值传递给附加的渲染器。

    view_config 仅与当前请求的视图相关。您调用的其他函数只是 Python 中的函数。

    如果您仍想将工作委派给另一个视图,那么有多种选择,但我们告诉人们的是您需要在子视图中显式调用 pyramid.renderers.renderrender_to_response。当然如果你只调用render,那么你必须把那个html body变成一个完整的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)
    

    每种方法都有明显的好处和注意事项。

    【讨论】:

    • 我的函数中没有返回完整的响应对象。我已经在文档中看到了所有的渲染方法,但我仍在学习哪种方法与每种情况相匹配。谢谢!
    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 2019-04-25
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2012-01-17
    相关资源
    最近更新 更多