我想创建一个简单的Zope2产品,它实现了一个“虚拟”文件夹,其中部分路径由我的代码处理。表单的URI
/members/$id/view
e.g。
/members/isaacnewton/view
应由/ members对象中的代码处理,即members.view(id='isaacnewton')
。
Zope TTW Python脚本有traverse_subpath
,但我不知道如何在我的产品代码中执行此操作。
我查看了IPublishTraverse
界面publishTraverse()
,但它似乎非常通用。
有更简单的方法吗?
答案 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