5

私は自分の研究を行い、いくつかのパターンマッチングの試行を行いましたが、それでも次の方法を理解できません。

  1. ルートの一部をオプションにします。例えば:

    / required (/optional / {str}) ここで、括弧内の部分はオプションです。

  2. ルーティングに制限を適用するため、ワイルドカード文字列の代わりに、タプルのアイテムと一致する必要があります。

    / view_1 / {('opt_a'、'opt_b'、'opt_c' ...)} この場合、タプルのアイテムが一致すると、404またはFORBIDDENでない場合はルーティングされます。

どうすればこれらを達成できますか?

ありがとうございました。

4

3 に答える 3

13

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ます。

于 2012-06-21T15:12:57.310 に答える
3

It's tricky to explain, but what you want is here http://docs.pylonsproject.org/projects/pyramid/en/1.0-branch/narr/hybrid.html - it's not the easiest of reads, but explains what you're after.

Update after further research

Using:

config.add_route('name', 'foo/*optional')

it's possible to receive the remaining path elements as a tuple

Custom predicates can be used to filter url dispatch as described in 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 に答える