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

2024-05-05 16:22:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经阅读了using different renderers或{a2},但我想知道是否有更好的方法来处理这种模式。在

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

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

现在,我希望ajax版本只呈现它的一个子集,也包含一些数据。我当前的工作代码:

^{pr2}$

我想特别是我想知道是否有一种更干净的方法来覆盖渲染器,然后将其包装在某个东西中,而不显式地调用render,并确保dict正确或请求作为param。谢谢


Tags: 方法nameview模板configa2模式items
1条回答
网友
1楼 · 发布于 2024-05-05 16:22:06

我不熟悉pyramid或“r.mako”所引用的内容,但您可能可以在调用控制器之前,使用一个检查请求的Accepts头的自定义函数来钩住该请求,寻找“text/javascript”或“application/json”作为最前面的接受,然后在request对象上设置一个标志(或者将该方法分解为在r函数中使用)。在

然后做一个定制的呈现器来处理mako解析或者转储一个json字符串

# pseudo-code
def before_controller(request, response):
    if 'text/html' in request.headers.accepts:
        request.is_json = False
    elif 'application/json' in request.headers.accepts:
        response.headers.set('Content-type', 'application/json')
        request.is_json = True

# pseudo-code
def my_renderer(request, response, result):
    if 'text/html' in request.headers.accepts:
        return # render html
    elif 'application/json' in request.headers.accepts:
        response.headers.set('Content-type', 'application/json')
        return json.dumps(result)

#
def r(request):
    items = get_items()
    if request.json:
        pass # update items with additional data
    return {'items': items} # one point of return

如果不需要对项目进行任何额外的处理,那么这个方法也意味着不需要额外的leg工作,只需将结果作为正常返回,并在另一端接收json对象。在

如果不能在调用控制器之前挂入金字塔,可以编写一个方便的函数来调用is_json(request),并在控制器和呈现器中使用它来确定输出和设置内容类型头

网友
2楼 · 发布于 2024-05-05 16:22:06

我建议使用两个视图,这两个视图允许您对相同的数据应用不同的“外观”(响应)。在

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

如果您害怕重复视图配置,Pyramid 1.3在基于类的视图上提供了一个很酷的新功能:

^{2}$

相关问题 更多 >