我已经完成研究并进行了一些模式匹配试验,但我仍然不知道如何:
将部分路线设为可选。例如:
/必需(/optional/{str}) 这里括号里的部分是可选的。
对路由应用约束,因此它必须匹配元组中的项目而不是通配符字符串。
/view_1/{('opt_a', 'opt_b', 'opt_c' ...)} 在这种情况下,如果匹配了元组中的一个项目,如果不是 404 或 FORBIDDEN,它就会路由
我怎样才能实现这些目标?
谢谢。
最佳答案
Pyramid 不支持路由中的可选模式。另一个答案建议 *optional
但这将比您要求的匹配更多,这是一个可选的占位符,并且在路线末尾没有更多模式的选项。
config.add_route('name_with_optional', '/required/{optional}/{str}')
config.add_route('name', '/required/{str}')
现在你想对我想象的两者使用相同的 View ,因为你认为占位符是可选的。因此,只需为这两种情况注册 View :
@view_config(route_name='name_with_optional')
@view_config(route_name='name')
def my_view(request):
optional = request.matchdict.get('optional')
如果 'name'
是匹配的路由模式,则 optional
变量将为 None
。
至于你的第二个问题,你可以简单地创建一个自定义谓词。这可以在路线上或 View 上(请记住,它们在 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
,则可以匹配具有相同模式的另一条路由(忽略该路由)。
View 上的谓词(更常见):
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')
在 View 中我们会知道 opt
是必需的选项之一。
关于python - Pyramid :路由模式和约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11136437/