Plone 遍历和禁止的 Zope id

Plone traversing and forbidden Zope ids

虽然你可以通过代码生成id以下划线开头的内容,比如“_foo”,但你似乎不能用这个遍历一个项目特殊标识。 每次尝试使用浏览器访问以这种方式命名的内容 都会导致 NotFound 错误。 __bobotraverse____getitem__ 之类的方法都没有被调用,就像很早就检查了这个限制一样。

这个限制是如何工作的,我该如何改变它?我可以访问 id 中带有前缀下划线的子对象吗?

在来自 OFS.TraversableunrestrictedTraverse 实现中找到:

if name[0] == '_':
    # Never allowed in a URL.
    raise NotFound, name

...但这还不够。在 publishTraverse 方法中的 ZPublisher.BaseRequest.DefaultPublishTraverse 中,还有另一个类似于@Mathias 通知的检查。

if name[:1]=='_':
    raise Forbidden("Object name begins with an underscore at: %s" % URL)

可悲的是要覆盖它并不简单:

  • unrestrictedTraverse 是在 Plone 站点上下文中调用的(因此我不能仅针对我的内容类型自定义它)
  • publishTraverse 方法由请求实现拥有(也许为此我可以使用广告自定义发布遍历器?)

解决这个问题的最简单方法似乎是通过 monkeypatch。