Django – ルーティング – urls.py

概要

リクエストされたURLから、Django内部で必要なview関数を呼ぶためのルーティングは、urls.pyで設定する。

  • urls.pyはプロジェクト設定ディレクトリーの下か、各アプリケーションディレクトリーの下
  • アプリケーションディレクトリー下のurls.pyは新規に作成し、設定ディレクトリーのurls.pyincludeする
  • ルーティングはurls.pyurlpatterns配列にpath関数で登録する
  • path関数の引数に、URLパターンとビュー関数を与える

ルーティングの流れについてはこちらも参照

設定ディレクトリー下のurls.py

プロジェクト構成

djangobasicsプロジェクトを作成。設定ディレクトリーをconfとし、アプリケーションurlincludeを作成・登録した場合のツリーは以下の通り。

ビューとテンプレート

urlinclude/views.pyを以下のように編集する。

urlinclude/templates/urlincludeディレクトリーを作成し、その下にindex.htmlを以下の内容で作成。

pathの登録

設定ディレクトリーconfの下のurls.pyに以下のように追記。以下、このurls.pyを「グローバルなurls.py」と呼ぶ。

まずアプリケーションのviewsモジュールをインポートしている。

そしてホスト名/アプリケーション名でindexビュー関数が呼ばれるようルーティング。

ここでhttp://localhost:8000/urlincludeでブラウザーからアクセスすると、index.htmlの内容が表示される。

アプリケーション下のurls.py

グローバルなurls.pyの問題点

設定ファイル直下のurls.pyでのpath登録は、

  • デフォルトで作成されたurls.pyを編集すればよい
  • 任意のアプリケーションのルーティング登録ができる

ただし以下のような問題点がある。

  • 登録するビューのアプリケーションをインポートする必要がある
  • 全てのビューを登録するため見通しが悪くなる
  • アプリケーション間でビューの名前の衝突が起こり得る

このため一般にはアプリケーションごとにurls.pyを作成し、そのモジュールを設定ディレクトリー下のグローバルなurls.pyincludeする。

ビューとテンプレート

ビューとテンプレートは先の例と同じものを使う。

アプリケーションのurls.pyの準備

アプリケーションディレクトリー下に、以下の内容でurls.pyファイルを作成する。conf/urls.pyのように自動作成されないので、新たに作成する必要がある。

ツリーは以下の通り。

グローバルなurls.pyの編集

conf/urls.pyを以下のように編集する。

  • django.urlsパッケージのpathモジュールに加えて、includeモジュールもインポートする
  • urlpatterns配列にpath関数を追加し、アプリケーションのurls.pyincludeする

ここでhttp://localhost:8000/urlinclude/indexにアクセスすると、index.htmlがブラウザーに表示される。

アプリケーションの登録

新たにアプリケーションを作成した場合には、プロジェクト共通ディレクトリーのsettings.pyINSTALLED_APPSに作成したアプリケーションを登録しておく必要がある。

留意点

グローバルなurls.pyでは、個々のアプリケーションのviewsモジュールをインポートする必要はない。

include関数の第1引数はアプリケーション名を使ったディレクトリーで、その後にアプリケーション内で定義したパスが続く。

  • 今回の例では'urlinclude/' + 'index''urlinclude/index'
  • 末尾に'/'がないとエラーになる

include関数の引数は、'アプリケーション.urls'の文字列。

  • 文字列にしていないと”名前が見つからない”、とエラーになる

直接テンプレートを表示する

path関数で直接テンプレートを表示させることもできるが、少し手間が必要。

  • urls.pyTemplateVierwクラスをインポート
  • path関数の第2引数にTemplateView.as_view()メソッドを与えてテンプレートを指定

たとえば以下は、index.htmlと同じディレクトリーにexample.htmlを作成し、これを直接path関数から呼び出す例。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です