ピラミッドでURL内のサブパスを逃れる方法
質問
ピラミッドによって生成されたルートでサブパスをパラマーとして渡す必要があります。 urllib.encodeとurllib.quoteを使用してみましたが、どちらにしても「リソースが見つかりませんでした」を取得しました。
ルート生成:
mypath='a/b/c'
new_route = route_url('new_model_route', self.request, subpath=urllib.encode(mypath))
私のルート:
config.add_route('new_model_route', '/model/new/{subpath}')
生成されたURL(「リソースが見つかりませんエラー」)
http://127.0.0.1:6544/rnd2/model/new/a%2Fb%2Fc
URLが http://blah/model/new/a
作品。
解決
ルートパターン /model/new/{subpath}
決して一致しません /model/new/a/b/c
だから、なぜあなたがそのパターンのURLを生成できるのか理解できませんか?
ただし、URLの残りの部分を要素として渡すことができます。
config.add_route('new_model_route', '/model/new/{subpath}')
request.route_url('new_model_route', 'b', 'c', subpath='a')
# /model/new/a/b/c
一方、別のオプションがあります。次のような、これらのURLに一致する新しいルートを作成できます。
config.add_route('new_model_route', '/model/new/*subpath')
# matches /model/new/a, /model/new/a/b, etc
request.route_url('new_model_route', subpath=('a', 'b', 'c'))
# /model/new/a/b/c
何らかの理由でこれらのURLを実際に一致させたくない場合は、追加できます static=True
に add_route
電話、つまり、あなたはのみ使用していることを意味します route name
URLを生成しますが、着信リクエストでそれらを一致させません。
subpath
と traverse
たまたま特別です(これはすべて文書化されています)が、「A/B/C」を使用することに夢中だった場合、ルートパターンで何か他のものを使用できます。
config.add_route('new_model_route', '/model/new/*rest')
# matches /model/new/a, /model/new/a/b, etc
request.route_url('new_model_route', rest='a/b/c')
# /model/new/a/b/c
ああ、私はロールしているので、システムに既に持っている可能性のあるよりシンプルなURLを使用して、元のアプローチを使用できます。
config.add_route('new_model_route', '/model/new')
# matches /model/new only
request.route_url('new_model_route', 'a', 'b', 'c')
# /model/new/a/b/c
所属していません StackOverflow