在Pyramid中,如何使用遍历创建动态URL?

4 投票
1 回答
1395 浏览
提问于 2025-04-16 20:24

我刚开始学习Pyramid,创建了一个应用程序。我有一个数据库,里面有一个类别的表。比如,一个类别可能是颜色,里面有红色和绿色这两个属性;另一个类别可能是大小,里面有4和5这两个属性。 我想创建一些链接,格式是:domain.com/{类别}。 举个例子,我有两个类别模板,一个是color.mak,另一个是size.mak。我想知道怎么才能让domain.com/Red或者domain.com/Green显示color.mak,而domain.com/4或者domain.com/5显示size.mak? 在阅读了URL调度和遍历的区别后,我觉得遍历更适合我想要的效果,尽管这两种方式都可以实现。我现在卡住的地方是,怎么把这些类别添加到我的资源树里。

1 个回答

6

首先,你需要让你的根资源通过 __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 文件中,你需要为不同的资源类型(也就是上下文类型)配置不同的视图:

    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 时,系统会查找对应的上下文和视图名称。比如说,当你访问 domain.com/Red 时,上下文会是 ColorCategory('Red')(因为这是你的根资源返回的内容),而视图名称会是 ''(因为在查找上下文后,路径就用完了)。然后,Pyramid 框架会根据上下文类型和视图名称来筛选出一个已配置的视图和模板。

撰写回答