1

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

/members/$id/view

例如

/members/isaacnewton/view

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

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

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

有没有更简单的方法?

4

1 回答 1

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,它应该是一个浏览器视图,需要member_id请求中的键。然后它可以完成它的工作:

class MemberView(BrowserView):
    def __call__(self):
        if 'member_id' in self.request.form:  # Huzzah, the traversal worked!
于 2013-02-07T21:34:35.313 回答