urls.py内での記述パターン
ViewGroupタプル中で、URLマッピングの設定を行う。
from kay.routing import ( ViewGroup, Rule ) view_groups = [ ViewGroup( Rule('A', endpoint='B', view='C'), ) ]
URLマッピングのフォーマット
B: endpoint文字列
C: マッピングするview関数文字列
マッピングさせたいURLとview関数がある場合、このフォーマットで列記する。Rule('A', endpoint='B', view='C'),A: URL文字列
B: endpoint文字列
C: マッピングする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