在金字塔中,使用遍历,如何创建动态网址?

时间:2011-06-27 22:33:45

标签: python traversal pyramid

我是Pyramid的新手并创建了一个应用程序。我有一个包含类别表的数据库。类别可以是具有红色和绿色属性的颜色,而另一个类别可以是具有属性4和5的大小。 我希望能够创建类似于:domain.com/ {category}的链接。 所以假设我有两个类别模板。一个是color.mak,一个是size.mak。我怎么能得到它所以domain.com/Red或domain.com/Green会渲染color.mak和domain.com/4或domain.com/5会渲染size.mak? 在阅读了URL Dispatch和Traversal之间的差异之后,看起来Traversal会成为我想要的首选,即使它可以以任何一种方式完成。我真正坚持的是如何将这些类别添加到我的资源树。

1 个答案:

答案 0 :(得分:6)

首先,您希望Root资源从__getitem__返回不同的资源类型:

class Root(object):
    def __getitem__(self, key):
        if key in ['Red', 'Green']:
            return ColorCategory(key)
        elif key in ['4', '5']:
            return SizeCategory(key)

class ColorCategory(object):
    ...

class SizeCategory(object):
    ...

然后在__init__.py中,您需要为不同的资源类型(a.k.a。上下文类型)配置不同的视图:

    config.add_view('myapp.views.color',
                context='myapp:resources.ColorCategory', name='',
                renderer='myapp:templates/color.mak')

    config.add_view('myapp.views.size',
                context='myapp:resources.SizeCategory', name='',
                renderer='myapp:templates/size.mak')

这将起作用的方式是,当您获得某个URL时,Traversal将查找某个上下文并查看名称。对于domain.com/Red,上下文将为ColorCategory('Red')(因为这是您的Root资源返回的内容),视图名称将为''(因为查找该上下文后路径完全被占用)。然后金字塔将使用上下文类型和视图名称作为过滤器来查找已配置的视图和模板。