Map をどうキレイに組むか。

プロジェクトとアプリの構成にも関係しますが、URI の設計も模索中です。
Werkzeug の Map と Rule が素晴らしいです。
defaults と methods は使い方を憶えました。subdomain を使ってみないと。

defaults は に渡す初期値を指定できます。 defaults={'key': 'eggs'} という使い方をします。

methods は GET や POST や DELETE 等、何を受け付けるかを urls.py レベルで指定出来ます。methods=['GET', 'POST',] としておけば指定したメソッド以外が来た場合 405 を返します。

# vim: fileencoding=utf8

from werkzeug.routing import (
  Map, Rule, Submount, EndpointPrefix, RuleTemplate,
)

resource = RuleTemplate([
  Rule('/${model}/', endpoint='${model}_index'),
  Rule('/create/${model}/', endpoint='create_${model}'),
  Rule('/update/${model}/<string:key>', endpoint='update_${model}'),
  Rule('/delete/${model}/<string:key>', endpoint='delete_${model}'),
])

url_map = Map([
  Rule('/', methods=['GET',], endpoint='index'),
  Rule('/home/', endpoint='home'),
  EndpointPrefix('admin/', [
    Submount('/admin', [
      resource(model='account'),
    ]),
  ]),
])

import unittest

class TestUrlMap(unittest.TestCase):
  def setUp(self):
    pass

  def test_all_urls(self):
    urls = url_map.bind('example.com', '/')
    assert urls.match('/', 'GET') == ('index', {})

    assert urls.build('index', {}) ==  '/'
    assert urls.build('home', {}) == '/home/'
    assert urls.build('admin/account_index', {}) == '/admin/account/'
    assert urls.build('admin/create_account', {}) == '/admin/create/account/'
    assert urls.build('admin/update_account', {'key': 'spam'}) == '/admin/update/account/spam'
    assert urls.build('admin/delete_account', {'key': 'spam'}) == '/admin/delete/account/spam'

  def tearDown(self):
    pass

if __name__ == '__main__':
  unittest.main()