urls.py
urls.pyは、URLのルーティングを定義します。いままでのサンプルコードでは、一つの関数でサンプルを作っていたので、あまり意識していませんでしたが、結構便利に使えます。
URLの定義方法
from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^articles/2003/$', 'news.views.special_case_2003'), (r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'), )
Djangoのマニュアルから抜粋したものです。
urlpatternsに patterns関数を使ってURLの設定を追加しています。
(r'^articles/2003/$', 'news.views.special_case_2003'),
これを見てもわかるとおり、一つ目の引数はマッチングルールで正規表現が使えます。二番目の引数はURLがマッチしたときに呼び出される関数を示しています。このサンプルを見ていると全てが news.views から始まる関数を呼び出しています。これを省略したいときは次のように書けます。
from django.conf.urls.defaults import * urlpatterns = patterns('news.views', (r'^articles/2003/$', 'special_case_2003'), (r'^articles/(\d{4})/$', 'year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'article_detail'), )
patterns 関数の1番目の引数に省略したいパッケージ名まで定義しておくことで、それ以下の設定はある程度省略が可能です。
外部のファイルを読み込む
機能が増えてくるとURLも多くなり、必然的に urls.py も分割したくなってくると思います。また、複数のアプリケーションを一つのプロジェクトの中に定義することもあると思います。そんなときは include 関数を使って、外部の他の urls.py を読み込みます。
from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^app1/$', include('app1.urls')), (r'^app2/$', include('app2.urls')), (r'^app3/$', include('app3.urls')), )
説明が要らないくらい簡単です。この例では http://example/app1/hoge にアクセスがあった時には app1 の urls.py に制御が渡されます。ちなみにこの app1 の urls.py の中では、以下のように指定します。
app1/urls.py
from django.conf.urls.defaults import * urlpatterns = patterns('app1.views', (r'^hoge$', include('hoge')), )
app1までは、呼び出し元で処理が行われるので、呼び出し先では、hogeのみを指定します。
URLの値を関数の引数に
Rails世代のフレームワークで一番それまでと異なっているのは、RESTfulなアプリケーションアーキテクチャを採用しやすくなっている点ではないでしょうか。Djangoでは、HttpRequest/HttpResponseの扱いやすさに加えて、urls.py で関数の引数にパラメータを与えることができるので、RESTと親和性が高いと言えると思います。(親和性が高い=全てがRESTful じゃないので注意)
def named_params(request, param1):
関数定義がこうだったとします。この param1 にURL上の値を設定する urls.py の設定は次のようになります。
(r'^named_params/(?P<param1>\d{4})/$', 'named_params')
(?P