Plone遍历和禁止Zope ID

keu*_*eul 4 zope plone

虽然您可以使用以下划线开头的id来生成代码内容,但是" _foo"似乎您无法遍历具有此特殊ID的项目.每次尝试使用浏览器访问以此方式命名的内容都会导致NotFound错误.这两种方法都不喜欢__bobotraverse__或被__getitem__调用,比如很早就检查了这个限制.

此限制如何工作以及如何更改?我可以访问ID中带有前缀下划线的子对象吗?

keu*_*eul 6

unrestrictedTraverse实现内部找到OFS.Traversable:

if name[0] == '_':
    # Never allowed in a URL.
    raise NotFound, name
Run Code Online (Sandbox Code Playgroud)

......但这还不够.还有一个类似于@Mathias ZPublisher.BaseRequest.DefaultPublishTraversepublishTraverse方法中通知的检查.

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

可悲的是,重写这个并不简单:

  • unrestrictedTraversePlone站点上下文中调用(因此我无法仅为我的内容类型自定义它)
  • publishTraverse方法归请求实现所有(为此我可以使用广告自定义发布遍历器?)

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