5

我正在创建一个使用遍历的简单的基于金字塔的 CMS。有一个名为 的类Collection,它有一些子类NewsCollection,例如GalleriesCollection等。

我需要两种视图来显示这些集合。前端,html 视图和后端,json 视图(管理面板使用 dgrid 显示数据)。后端视图可以是通用的——它在每种情况下都转储 json 数据。前端视图不应该——每种数据都有一个自定义模板。

问题是:当我像这样配置视图时:

@view_config(context=Collection, xhr=True, renderer='json', accept='application/json')

它工作正常。但是,只要我添加了为此配置的任何视图,NewsCollection就会优先考虑。即使我将谓词专门用于与上述配置冲突(例如accept='text/html'),仍然不会调用上述视图。相反,我会得到一个“谓词不匹配”。

Collection我的问题是-当还有视图时,我可以做任何事情来使配置为的视图被调用NewsCollection吗?还是我必须使用其他设计(例如url 调度或为不同的资源类型多次添加相同的视图)

4

1 回答 1

6

我尝试构建一个非常相似的系统并发现了同样的问题 - 事实上,这是 Pyramid 错误跟踪器中的票:https ://github.com/Pylons/pyramid/issues/409

简而言之,并非 Pyramid 中的所有视图谓词都是相等的——context这是一种特殊情况。视图首先使用匹配context,然后使用其他谓词缩小选择范围。

还有一个最近的拉取请求,这将使 Pyramid 的行为方式与您(和我)期望的一样——但是,从那里的讨论中,我看到由于可能的性能权衡,它不太可能被采用。

更新:拉取请求已于 2013 年 3 月合并,所以我想它应该在 1.4 之后的版本中可用)

一种解决方法是使用自定义谓词:

def context_implements(*types):
    """
    A custom predicate to implement matching views to resources which
    implement more than one interface - in this situation Pyramid has
    trouble matching views to the second registered interface. See
    https://github.com/Pylons/pyramid/issues/409#issuecomment-3578518

    Accepts a list of interfaces - if ANY of them are implemented the function
    returns True
    """
    def inner(context, request):
        for typ in types:
            if typ.providedBy(context):
                return True
        return False
    return inner


@view_config(context=ICollection,
    custom_predicates=(context_implements(INewsCollection),)
    )
def news_collection_view(context, request):
    ....
于 2013-02-14T13:46:26.983 回答