日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

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 というところがポイントです。この引数に値を設定するところでも、正規表現を利用できます。正規表現さえわかれば簡単だと思います。

まとめ

ざっと、URLルーティングを設定するときに必要そうな箇所だけを紹介しましたが、Djangoにはもっと多くの機能が用意されています。もっと突っ込んだ内容を知りたいときは、マニュアルを参照すると良いと思いますが、あまりこれ以上は使わないかも。


次回は、関数名からURLを逆引きするような処理を作ってみたいと思います。
ちなみに送別会とか諸々あり、明日、明後日は更新しません。
うーん、早くモデルに入りたい。