我已经做了我的研究,并做了一些模式匹配试验,但我仍然无法弄清楚如何:金字塔:路由模式和约束
设为可选路线的一部分。例如:
/要求(/可选/ {str}) 这里括号中的部分是可选的。
将约束应用于路由选择,以代替通配符字符串,它必须匹配元组中的项目。
/view_1/{( 'opt_a', 'opt_b', 'opt_c' ...)}在这种情况下 ,如果从元组中的项目匹配时,它的路由如果不是404或FORBIDDEN
我该如何实现这些目标?
谢谢。
我已经做了我的研究,并做了一些模式匹配试验,但我仍然无法弄清楚如何:金字塔:路由模式和约束
设为可选路线的一部分。例如:
/要求(/可选/ {str}) 这里括号中的部分是可选的。
将约束应用于路由选择,以代替通配符字符串,它必须匹配元组中的项目。
/view_1/{( 'opt_a', 'opt_b', 'opt_c' ...)}在这种情况下 ,如果从元组中的项目匹配时,它的路由如果不是404或FORBIDDEN
我该如何实现这些目标?
谢谢。
金字塔不支持可选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
是必需的选项之一。
这很难解释,但你想要的是在这里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
你好乔恩。我已经读过这个。正如你所建议的,我想我需要用Traverse或Hybrid路线。这是一个耻辱,路由系统不包括“可选”和元组匹配。谢谢。 – Phil
Hi @Phil - 思考它,可选可以使用add.route('whatever','/ required/* optional'),其中可选是简单的而不是/ a/b/c/d等等。 –
* *和** - 我需要更新金字塔 - 阅读http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/urldispatch.html?awesome - 并向下滚动到Custom Route Predicates - 涵盖您的元组问题:) –
除了使用自定义路由谓词,您还可以使用URL遍历来实现这两点。我写了一个detailed answer回应你的其他问题。
我相信遍历是这种用例的更清洁和“更自然”的解决方案。
感谢您的好评!但它包含一个小错字:info ['matchdict']应该是info ['match']。 – drnextgis
固定,告诉你路由谓词不太常见! –
谢谢!很有帮助。 –