読者です 読者をやめる 読者になる 読者になる

URLConfにシーケンスを与えることができるようになった

Django

Django1.1からURLConfのinclude関数にシーケンスを与えることができるようになった。

The include() function in Django URLConf modules can now accept sequences of URL patterns (generated by patterns()) in addition to module names.

http://docs.djangoproject.com/en/dev/releases/1.1-alpha-1/#other-improvements

具体例で示すと、

from django.conf.urls.defaults import *

APP1_URLS = patterns(
  'myproject.app1.views',
  url(r'^$', 'do_something'),
)

APP2_URLS = patterns(
  'myproject.app2.views',
  url(r'^$', 'do_something'),
)

urlpatterns = patterns(
    '',
    url(r'^app1/', include(APP1_URLS)),
    url(r'^app2/', include(APP2_URLS)),
)

のように書けるようになった。

include()には、patterns()が返すシーケンスではなく、通常のlistやtupleも与えることができる。ただしその場合は、文字列でビュー関数名を指定することはできず、ビュー関数そのものを指定しなくてはならない。すなわち、

# won't work!!
from django.conf.urls.defaults import *

APP3_URLS = [
  url(r'^$', 'do_something'),
]

urlpatterns = patterns(
    '',
    url(r'^app3/', include(APP3_URLS)),
)

は動作せず、

# works!!
from django.conf.urls.defaults import *
from myproject.app3 import views

APP3_URLS = [
  url(r'^$', views.do_something),
]

urlpatterns = patterns(
    '',
    url(r'^app3/', include(APP3_URLS)),
)

ならば動作する。この辺は意図してこうような動作になっているかは分からないので、曖昧さを避けるために常にpatterns()を使うのが無難だろう。

この機能は小さな変更に見えて、URL設計に柔軟性を与える重要な変更。(すぐにでもこれを使いたい箇所はあるが、本当にDjango1.0で同様のことができないのかもう少し考えてみる。)