【问题标题】:Change the view prefix in pyramid traversal from "@@" to "+"将金字塔遍历中的视图前缀从“@@”更改为“+”
【发布时间】:2011-05-24 13:54:15
【问题描述】:

我正在考虑将网络应用从 pylons 移动到 pyramid(正式为 repoze.bfg),因为遍历比 url 调度更适合我的应用。

目前,当我有一个包含多个视图的 obj 时,我的视图名称在 url 中以“+”为前缀。例如:

/path/to/obj/   (default view)
/path/to/obj/+custom_view1
/path/to/obj/+custom_view2
/path/to/obj/+edit
/path/to/obj/+delete
/path/to/obj/sub_obj/

Pyramid 有一个特性来处理这个是一个不错的方法,但它使用前缀“@@”。有没有办法把它改成“+”,这样我就可以保持我的网址不变(你知道他们对酷网址的看法,)并使用这个功能。

【问题讨论】:

  • 这应该被标记为“金字塔”,但它是新的,我没有足够的代表。
  • + 通常用于创建新对象/项目的表单,所以我建议不要这样做,因为它可能会造成混淆。那说@@(两只瞪大的眼睛,那个观点,看到了吗?哈哈)可能也不是最漂亮的,但我不知道如何改变它。顺便说一句,你需要在 Pyramid 中使用 @@ 吗?在 Zope 中,如果与子对象存在名称冲突,则只需要 @@。
  • 如果你想要 +,为什么不简单地将它作为视图名称的一部分呢? config.add_view(name='+edit')?
  • 正如 Lennart 所说,如果您满足于不将任何子对象命名为与视图相同的名称('custom_view1',...),则不需要视图前缀。
  • 我总是想要视图前缀(ant不只是在视图名称中添加“+”)的原因是我可以获得遍历以避免调用 context.__getitem__ (我的应用程序的情况将包括一个数据库查询。)

标签: python repoze.bfg pyramid


【解决方案1】:

是和否,您可以从“@@”更改视图前缀,但新前缀也应该是 2 符号长度,请参阅 sources 用于遍历。

子类化ResourceTreeTraverser 然后注册它而不是默认的应该可以解决问题:

from pyramid.traversal import ResourceTreeTraverser as BaseResourceTreeTraverser

class ResourceTreeTraverser(BaseResourceTreeTraverser):
    VIEW_SELECTOR = "++"

from pyramid.config import Configurator
from pyramid.interfaces import ITraverser
from zope.interface import Interface

config = Configurator()
config.registry.registerAdapter(ResourceTreeTraverser, (Interface,), ITraverser)

我个人认为 VIEW_SELECTOR 应该被重构以允许任何长度的视图前缀。

【讨论】:

  • 谢谢。我看过该代码,但无法弄清楚它是如何注册自定义 ITraverser 的。我已经提交了一个拉取请求以允许任何长度的视图选择器。 github.com/Pylons/pyramid/pull/99
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多