Pyramidのドキュメント読んでたら用語につまずいてしまったので整理。

トラバーサルってなに?

Much Ado About Traversal (翻訳)

Traversal is an alternative to URL dispatch which allows Pyramid applications to map URLs to code.

URLマッチングでは解決しにくい問題に対するもう一つのURL dispatcher。

自分の理解ではSAStrutsでは暗黙の規約となっている URLパスをパッケージ名に照らし合わせて特定のActionメソッドを呼び出すようなルールを 独自に定義して利用できますよ、といったところ。

URLマッチング

URLパスを解析しあらかじめ登録されたURLパターンと比較してマッチした場合に関連付けらた関数を呼び出す。 複数のパターンにマッチした場合の解決策は先着順であることが多い。

トラバーサル

ファイルシステム検索の仕組みのように 特定のリソースが特定のURLパスによって検索されるプロセス。

/joeschmoe/photos/photo1に対して以下の擬似コード、

1
get_root()['joeschmoe']['photos']['photo1']

に表現されるような辞書から返却されるリソースとして解決する。

リソースの辞書
  • ソース内に直接ハードコーディングされたサイトURL構造から
  • RDB等に永続化されたオブジェクトから
  • 特定ディレクトリのフォルダ構造から

といったように構築する。

ビュー検索

/joeschmoe/photos/photo1/edit に対するリクエストはトラバーサルによって 以下のようにリソースが検索されるが、

  • get_root() -> リソース
  • get_root()[‘joeschmoe’] -> リソース
  • get_root()[‘joeschmoe’][‘photos’] -> リソース
  • get_root()[‘joeschmoe’][‘photos’][‘photo1’] -> リソース
  • get_root()[‘joeschmoe’][‘photos’][‘photo1’][‘edit’] -> リソースでない

末端となるリソースが解決された時点でリクエストパス全体がまだ消費されていない場合に 直後のパスセグメントeditview nameとして扱われる。 photo1リソースをコンテキストとしてeditビュー(関数)が検索される。

1
2
3
4
context = get_root()['joeschmoe']['photos']['photo1']
view_callable = get_view(context, 'edit')
request.context = context
view_callable(request)

ユースケース

典型的にはCMSのようにURLパスがエンドユーザによって任意に作成されていく場合に URLパターンでは対応が不可能または複雑になることに対する解決策として導入する。

そうではないURL固定パターンでもサイト構造を辞書にハードコーディングしておけばいいので トラバーサルの仕組みでディスパッチしとけばよし。

用語がわからないだけで概念はあるあるでした。

以上。

Comments