ajax加载金字塔的更好模式?

Tim*_*mmy 4 python pyramid

我已经阅读了使用不同的渲染器重写渲染器,但我想知道是否有更好的方法来处理这种模式.

现在,在我看来,我正在向模板返回一组项目:

@view_config(
    route_name = 'name',
    permission = 'perm',
    renderer   = 'r.mako'
)
def r( request ):
     items = get_items()
     return { 'items': items }
Run Code Online (Sandbox Code Playgroud)

现在我希望ajax版本只是渲染它的一个子集,也有一些数据.我目前的工作代码:

@view_config(
    route_name = 'name',
    permission = 'perm',
    renderer   = 'r.mako'
)
def r( request ):
     items = get_items()

     if ajax:
         return Response( to_json( {
                             'data1':  1,
                             'data2':  2,
                             'data3':  3,
                             'html':  renderers.render( 'shortr.mako',
                                                        { 'items': items },
                                                        request )
                         } )

     return { 'items': items }
Run Code Online (Sandbox Code Playgroud)

我想具体我想知道是否有一种更简洁的方法来覆盖渲染器,然后将其包装在某些东西中,而不显式调用渲染并确保我得到了正确的dict或请求作为参数.谢谢

Mic*_*kel 8

我建议使用2个视图,它们可以恰当地允许您对同一数据应用不同的"外观"(响应).

def get_items(request):
    return {} # values that you can pick and choose from in each view

@view_config(route_name='name', permission='perm', xhr=True, renderer='json')
def r_ajax(request):
    items = get_items(request)
    return {
        'data1': 1, 'data2': 2, 'data3': 3,
        'html': renderers.render('shortr.mako', {'items': items}, request),
    }

@view_config(route_name='name', permission='perm', renderer='r.mako')
def r_html(request):
    items = get_items(request)
    return items
Run Code Online (Sandbox Code Playgroud)

如果你害怕为视图配置重复一些事情,Pyramid 1.3在其基于类的视图上带来了一个很酷的新功能:

@view_defaults(route_name='name', permission='perm')
class R(object):
    def __init__(self, request):
        self.request = request
        self.items = # ...

    @view_config(xhr=True, renderer='json')
    def ajax(request):
        return {
            'data1': 1, 'data2': 2, 'data3': 3,
            'html': renderers.render('shortr.mako', {'items': items}, request),
        }

    @view_config(renderer='r.mako')
    def html(request):
        return self.items
Run Code Online (Sandbox Code Playgroud)