Plone 遍历和禁止的 Zope id
Plone traversing and forbidden Zope ids
虽然你可以通过代码生成id以下划线开头的内容,比如“_foo
”,但你似乎不能用这个遍历一个项目特殊标识。
每次尝试使用浏览器访问以这种方式命名的内容 都会导致 NotFound 错误。 __bobotraverse__
或 __getitem__
之类的方法都没有被调用,就像很早就检查了这个限制一样。
这个限制是如何工作的,我该如何改变它?我可以访问 id 中带有前缀下划线的子对象吗?
在来自 OFS.Traversable
的 unrestrictedTraverse
实现中找到:
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。
虽然你可以通过代码生成id以下划线开头的内容,比如“_foo
”,但你似乎不能用这个遍历一个项目特殊标识。
每次尝试使用浏览器访问以这种方式命名的内容 都会导致 NotFound 错误。 __bobotraverse__
或 __getitem__
之类的方法都没有被调用,就像很早就检查了这个限制一样。
这个限制是如何工作的,我该如何改变它?我可以访问 id 中带有前缀下划线的子对象吗?
在来自 OFS.Traversable
的 unrestrictedTraverse
实现中找到:
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。