2012-06-21 81 views
4

我已经做了我的研究,并做了一些模式匹配试验,但我仍然无法弄清楚如何:金字塔:路由模式和约束

  1. 设为可选路线的一部分。例如:

    /要求(/可选/ {str}) 这里括号中的部分是可选的。

  2. 将约束应用于路由选择,以代替通配符字符串,它必须匹配元组中的项目。

    /view_1/{( 'opt_a', 'opt_b', 'opt_c' ...)}在这种情况下 ,如果从元组中的项目匹配时,它的路由如果不是404或FORBIDDEN

我该如何实现这些目标?

谢谢。

回答

10

金字塔不支持可选pa在一条路线中。另一个答案建议*optional,但这将比您要求的哪一个可选占位符要多得多,并且在路径末尾没有选项可以让您选择更多模式。

config.add_route('name_with_optional', '/required/{optional}/{str}') 
config.add_route('name', '/required/{str}') 

现在你想为我想象的那样使用相同的视图,因为你正在考虑占位符是可选的。因此,简单地注册该视图为两种情况:

@view_config(route_name='name_with_optional') 
@view_config(route_name='name') 
def my_view(request): 
    optional = request.matchdict.get('optional') 

optional变量将是None如果'name'是匹配的路由模式。

至于你的第二个问题,你可以简单地创建一个自定义谓词。这可能是路线或视图(请记住这些在金字塔中是分开的)。谓词的签名在每种情况下都不相同。

路线(较少)上的谓词:

def opt_must_contain(info, request): 
    opt = info['match'].get('opt') 
    return opt in ('opt_a', 'opt_b', 'opt_c') 

config.add_route('my_route', '/view_1/{opt}', custom_predicates=[opt_must_contain]) 

如果该谓词返回False然后用相同的图案的另一路线,可以匹配(路线被忽略)。

在视图(多见)谓词:

def opt_must_contain(context, request): 
    opt = request.matchdict.get('opt') 
    return opt in ('opt_a', 'opt_b', 'opt_c') 

config.add_route('my_route', '/view_1/{opt}') 

@view_config(route_name='my_route', custom_predicates=[opt_must_contain]) 
def my_view(request): 
    opt = request.matchdict.get('opt') 

在视图中我们就知道opt是必需的选项之一。

+0

感谢您的好评!但它包含一个小错字:info ['matchdict']应该是info ['match']。 – drnextgis

+0

固定,告诉你路由谓词不太常见! –

+0

谢谢!很有帮助。 –

3

这很难解释,但你想要的是在这里http://docs.pylonsproject.org/projects/pyramid/en/1.0-branch/narr/hybrid.html - 这不是最简单的读取,但解释你在追求什么。

更新后进一步研究

使用:

config.add_route('name', 'foo/*optional') 

有可能接收剩余的路径元素作为一个元组中描述

自定义谓词可以用来过滤URL调度http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/urldispatch.html?awesome

+0

你好乔恩。我已经读过这个。正如你所建议的,我想我需要用Traverse或Hybrid路线。这是一个耻辱,路由系统不包括“可选”和元组匹配。谢谢。 – Phil

+0

Hi @Phil - 思考它,可选可以使用add.route('whatever','/ required/* optional'),其中可选是简单的而不是/ a/b/c/d等等。 –

+0

* *和** - 我需要更新金字塔 - 阅读http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/urldispatch.html?awesome - 并向下滚动到Custom Route Predicates - 涵盖您的元组问题:) –

0

除了使用自定义路由谓词,您还可以使用URL遍历来实现这两点。我写了一个detailed answer回应你的其他问题。

我相信遍历是这种用例的更清洁和“更自然”的解决方案。