2011-12-07 8 views
0

Pyramidによって生成されたルートでサブパスをパラメータとして渡す必要があります。私はurllib.encodeとurllib.quoteを使用しようとしましたが、いずれの方法でも "リソースが見つかりませんでした"というエラーが表示されます。PyramidでURL内のサブパスからエスケープする方法

経路生成:

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が機能するのでエスケープする。

答えて

2

ルートパターン/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と一致したくなかった場合、あなたはあなたがしていることを意味add_routeコールにstatic=Trueを追加することができます

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と一致するように、新しいルートを作成することができますroute nameのみを使用してURLを生成しますが、着信要求に一致させることはありません。

subpathtraverse特別なことが起こる(これはすべて文書化されて)いますが、「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 
+0

/* restメソッドは私が必要とするものの大半を占めているようですが、これらのパラメータ(a/b/c)をすべて単一の文字列として扱う方法はありますか?今、私は新しい見方でそれらを再び参加させなければなりません。 – sutee

+0

'* rest'構文を使うと、Pyramidは常にそのURLの残りをタプルに変換します。リクエストオブジェクトには他の属性がありますが、 'request.path'のように、マッチしたルートから独立しています。あなたはおそらく 'rest = '/'。join(request.matchdict ['rest'])'をしなければならないでしょう。 –

+0

タプルのどの部分がパラメータであり、他の部分が何であったかを伝える必要があるので、* rest構文を使用して他のパラメータを渡したければ、問題が発生すると思いますか? – sutee

関連する問題