2010年12月4日土曜日

Kay URLマッピング② urls.py設定方法

urls.pyでのURLマッピング記述は次の通りに行う。
urls.py内での記述パターン
from kay.routing import (
  ViewGroup, Rule
)
 
view_groups = [
  ViewGroup(
    Rule('A', endpoint='B', view='C'),
  )
]
ViewGroupタプル中で、URLマッピングの設定を行う。
URLマッピングのフォーマット
Rule('A', endpoint='B', view='C'),
  A: URL文字列
  B: endpoint文字列
  C: マッピングするview関数文字列

マッピングさせたいURLとview関数がある場合、このフォーマットで列記する。
この他注意点などについて、以下説明していく。

endpointの説明

endpoint(B)は逆引き関数で利用する。具体的にはurl_for関数に

  'アプリケーション名/endpoint(B)'

の形で引数を与えると、対応するURL(A)を返すことになっている。
def index(request):
  form = CommentForm()
  if request.method == "POST" and form.validate(request.form):
    comment = Comment(body=form['body'])
    comment.put()
    return redirect(url_for('myapp/index'))
  return render_to_response('myapp/index.html',
                            {'form': form.as_widget()})
デフォルトではアプリケーション間で名前が衝突しないよう、逆引き時にアプリケーション名をプレフィックスする。 もし名前にプレフィックスを付けたくない時は、

  add_app_prefix_to_endpoint = False

にする。
view_groups = [
  ViewGroup(Rule('/', endpoint='index', view='myapp.views.index'),
            add_app_prefix_to_endpoint=False)
]


view関数文字列について

マッピングするview関数文字列(C)は、直接関数を指定することも可能。
import myapp.views
view_groups = [
  ViewGroup(
    Rule('/', endpoint='index', view=myapp.views.index),
  ),
]
直接関数を指定する場合は、import myapp.views のように定義しているモジュールをインポートする必要がある。
しかし、この定義方法はインポートするモジュールが巨大だと、ロードに時間がかかるという問題がある。 このため、Cの定義には文字列で指定するのが良い(文字列での指定は遅延ロードと呼ばれている)。
参考 Kay ドキュメント URLマッピング ビューを追加する


キーワード引数付きURL

キーワード引数は、<variable_name> のように引数名を山括弧で囲んだフォーマットを利用する。キーワード引数を含むURLを、URLマッピングとして登録しておくことが必要。
view_groups = [
  ViewGroup(
    Rule('/<id>', endpoint='show_id', view='myapp.views.show_id'),
    Rule('/<id>/<int:year>', endpoint='show_id_year', view='myapp.views.show_id_year'),
  ),
]
キーワード引数のフォーマットは、次のサイトでいろいろ説明されている。
参考 werkzeug URL Routing


マッピングするview関数は、(キーワード引数があっても無くても)第一引数として必ず requestオブジェクトを受け取る。第二引数以降に、キーワード引数を定義する。
def show_id_year(request, id, year):
  # ..
  # ..


マッピングするview関数(C)設定値の省略

同一のendpointを持つURLパターンではview設定を省略できる。
view_groups = [
  ViewGroup(
    Rule('/list', endpoint='show_list', view='myapp.views.show_list'),
    Rule('/list/<id>', endpoint='show_list')
  )
]
endpoint が show_list のURLパターンは、両方共 myapp.views.show_list に紐付けられる。


参考
Kayドキュメント URLマッピング
werkzeug URL Routing