Plone遍历和禁止Zope ID

Plone遍历和禁止Zope ID,plone,zope,Plone,Zope,虽然您可以通过代码生成id以下划线开头的内容,例如“\u foo”,但似乎无法使用此特殊id遍历项目。 每次尝试使用浏览器访问以这种方式命名的内容都会导致NotFound错误。既不调用\uuuuu bobotraverse\uuuuu或\uuuuu getitem\uuuuuu之类的方法,就像很早就检查了此限制一样 这个限制是如何起作用的,我怎样才能改变它?我可以访问id中带有前缀下划线的子对象吗?可以在OFS的无限制行程实现中找到。可遍历的: if name[0] == '_': #

虽然您可以通过代码生成id以下划线开头的内容,例如“
\u foo
”,但似乎无法使用此特殊id遍历项目。 每次尝试使用浏览器访问以这种方式命名的内容都会导致NotFound错误。既不调用
\uuuuu bobotraverse\uuuuu
\uuuuu getitem\uuuuuu
之类的方法,就像很早就检查了此限制一样


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

可以在OFS的
无限制行程
实现中找到。可遍历的

if name[0] == '_':
    # Never allowed in a URL.
    raise NotFound, name
……但这还不够。在
publishTraverse
方法中,还有另一个类似于@Mathias inside
ZPublisher.BaseRequest.DefaultPublishTraverse
通知的检查

if name[:1]=='_':
    raise Forbidden("Object name begins with an underscore at: %s" % URL)
可悲的是,要覆盖这一点并不容易:

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

修复此问题的最简单方法似乎是通过monkeypatch。

AFAIK,它的实现方式是beforetraversel钩子。但我不确定他们把代码埋在哪里:-)我会在挖得足够深的时候添加一个答案。澄清你的意思是什么样的遍历?通过HTTPRequest或类似unrestrictedTraverse()的东西发布对象?我只需要通过浏览器访问一个类似hmmm的URL。。。这可能对您有所帮助:。但它会引发未经授权的NotFound。@Mathias它确实会引发NotFound。我在这里看到了一些引用:这是:对名称以下划线字符“\u1”开头的对象的访问总是被拒绝,并提醒尾随下划线表示内部使用的位置。