处理Zope2产品中的遍历

时间:2013-02-07 11:28:24

标签: zope

我想创建一个简单的Zope2产品,它实现了一个“虚拟”文件夹,其中部分路径由我的代码处理。表单的URI

/members/$id/view

e.g。

/members/isaacnewton/view

应由/ members对象中的代码处理,即members.view(id='isaacnewton')

之类的方法

Zope TTW Python脚本有traverse_subpath,但我不知道如何在我的产品代码中执行此操作。

我查看了IPublishTraverse界面publishTraverse(),但它似乎非常通用。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用__before_publishing_traverse__对象上的members挂钩:

from zExceptions import Redirect


def __before_publishing_traverse__(self, object, request):
    stack = request.TraversalRequestNameStack
    if len(stack) > 1 and stack[-2] == 'view':
        try:
            self.request.form['member_id'] = stack.pop(-1)
            if not validate(self.request['member_id']):
                raise ValueError
        except (IndexError, ValueError):
            # missing context or not an integer id; perhaps some URL hacking going on?
            raise Redirect(self.absolute_url())  # redirects to `/members`, adjust as needed

发布者在进一步遍历之前调用此方法;所以发布者已经找到了members对象,并且这个方法自己传递(object)和请求。根据请求,您将找到遍历堆栈;在您举例['view', 'isaacnewton']的示例中,此方法将'isaacnewton'移动到密钥'member_id'下的请求(在可选的验证之后)。

当此方法返回时,发布者将使用剩余的堆栈继续遍历,因此它现在将遍历到view,这应该是一个需要{的浏览器视图{1}}请求中的密钥。然后它可以做它的工作:

member_id