views.pyにview関数をwrapするオブジェクトを作る

以下のようなurlを指定する必要があって面倒。

  1. json/foo
  2. json/bar
  3. json/hoo
  4. ....

普通にurls.pyを書くと

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    url(r'^json/foo', "app.jsonapp.views.foo", name="json_foo"), 
    url(r'^json/bar', "app.jsonapp.views.bar", name="json_bar"), 
    url(r'^json/hoo', "app.jsonapp.views.hoo", name="json_hoo"), 
# ...
)

という感じに長くなる。めんどいかなと。

viewsの中にDispatcherを書いて,urls.pyのところは以下の一行だけですむようにしてみた。

urlpatterns = patterns('',
    url(r'^json/(?P<action>.+)$', "app.jsonapp.views.dispatch", name="json_api"), 
)

views.pyはこんな感じ。

class Dispatch(object):
    views = {}
    def __new__(self, *args, **kw):
        pass

    @classmethod
    def register(cls, fn, name=None):
        name = name or fn.__name__
        cls.views[name] = fn
        return fn

    @classmethod
    def dispatch(cls, request, action, *args, **kw):
        fn = cls.views.get(action, None)
        if fn is None:
            raise Http404
        else:
            return fn(request, *args, **kw)

dispatch = Dispatch.dispatch
register = Dispath.register

@register
def foo(request):
    pass

@register
def bar(request):
    pass

@register
def boo(request):
    pass

思ったよりも便利じゃない。

misc

templateのところで、バカなことをしていた。頭悪い。メモ。

{% comment %}
<a href="{% url json_api foo %}" //こう書いて動かないなー。とかバカなことしてた。
{% endcomment%}

<a href="{% url json_api "foo" %}"

ただしくは下の方。
contextからfooという変数を探す -> そんなの無い。(defaultは"") -> 何も表示されない。