Phi*_*hil 4 python python-2.7 pyramid
我做了我的研究并做了一些模式匹配试验,但我仍然无法弄清楚如何:
使路线的一部分可选.例如:
/ required (/ optional/{str}) 这里括号中的部分是可选的.
将约束应用于路由,因此它必须与元组中的项匹配,而不是通配符字符串.
/ view_1/{('opt_a','opt_b','opt_c'...)} 在这种情况下,如果元组中的项目匹配,则路由,如果不是404或FORBIDDEN
我怎样才能实现这些目标?
谢谢.
Mic*_*kel 12
金字塔不支持路线中的可选模式.另一个答案表明,*optional但这比你要求的一个可选占位符要多得多,并且在路径的末尾没有任何选项可以获得更多模式.
config.add_route('name_with_optional', '/required/{optional}/{str}')
config.add_route('name', '/required/{str}')
Run Code Online (Sandbox Code Playgroud)
现在你想要为我想象的两个使用相同的视图,因为你认为占位符是可选的.因此,只需为两种情况注册视图:
@view_config(route_name='name_with_optional')
@view_config(route_name='name')
def my_view(request):
optional = request.matchdict.get('optional')
Run Code Online (Sandbox Code Playgroud)
该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])
Run Code Online (Sandbox Code Playgroud)
如果此谓词返回,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')
Run Code Online (Sandbox Code Playgroud)
在视图中,我们将知道opt是必需的选项之一.
| 归档时间: |
|
| 查看次数: |
1674 次 |
| 最近记录: |