5

我已经完成了研究并进行了一些模式匹配试验,但我仍然无法弄清楚如何:

  1. 使部分路线可选。例如:

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

  2. 将限制应用于路由,因此它必须匹配元组中的项目,而不是通配符字符串。

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

我怎样才能实现这些?

谢谢你。

4

3 回答 3

13

Pyramid 不支持路由中的可选模式。另一个答案表明*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'匹配的路由模式。

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

路线上的谓词(不太常见):

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是必需的选项之一。

于 2012-06-21T15:12:57.310 回答
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中所述

于 2012-06-21T11:07:29.880 回答
0

除了使用自定义路由谓词之外,您还可以使用 URL 遍历来实现这两件事。我写了一个详细的答案来回答你的另一个问题。

对于此类用例,我相信遍历是一种更清洁且“更自然”的解决方案。

于 2012-06-21T22:37:35.020 回答