Pyramidは、ルート内のオプションのパターンをサポートしていません。他の答えは示唆して*optional
いますが、これは1つのオプションのプレースホルダーであるあなたが求めたものよりもはるかに一致し、より多くのパターンのためのルートの最後にオプションがありません。
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'
2番目の質問については、カスタム述語を作成するだけです。これは、ルート上またはビュー上にある可能性があります(これらはピラミッドで分離されていることに注意してください)。述語の署名は、それぞれの場合で異なります。
ルート上の述語(あまり一般的ではありません):
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')
ビューでは、必要なオプションの1つであることがわかりopt
ます。