概要
リクエストされたURLから、Django内部で必要なview関数を呼ぶためのルーティングは、urls.pyで設定する。
urls.pyはプロジェクト設定ディレクトリーの下か、各アプリケーションディレクトリーの下- アプリケーションディレクトリー下の
urls.pyは新規に作成し、設定ディレクトリーのurls.pyでincludeする - ルーティングは
urls.pyのurlpatterns配列にpath関数で登録する path関数の引数に、URLパターンとビュー関数を与える
設定ディレクトリー下のurls.py
プロジェクト構成
djangobasicsプロジェクトを作成。設定ディレクトリーをconfとし、アプリケーションurlincludeを作成・登録した場合のツリーは以下の通り。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/djangobasics/ ├── conf │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── urlinclude ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py |
ビューとテンプレート
urlinclude/views.pyを以下のように編集する。
|
1 2 3 4 |
from django.shortcuts import render def index(request): return render(request, 'urlinclude/index.html') |
urlinclude/templates/urlincludeディレクトリーを作成し、その下にindex.htmlを以下の内容で作成。
|
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Index</title> </head> <body> <h1>Index</h1> </body> </html> |
pathの登録
設定ディレクトリーconfの下のurls.pyに以下のように追記。以下、このurls.pyを「グローバルなurls.py」と呼ぶ。
|
1 2 3 4 5 6 7 8 |
from django.contrib import admin from django.urls import path from urlinclude import views urlpatterns = [ path('admin/', admin.site.urls), path('urlinclude', views.index), ] |
まずアプリケーションのviewsモジュールをインポートしている。
|
1 |
from アプリケーション名 import views |
そしてホスト名/アプリケーション名でindexビュー関数が呼ばれるようルーティング。
|
1 |
path('アプリケーション名', views.ビュー関数) |
ここでhttp://localhost:8000/urlincludeでブラウザーからアクセスすると、index.htmlの内容が表示される。
アプリケーション下のurls.py
グローバルなurls.pyの問題点
設定ファイル直下のurls.pyでのpath登録は、
- デフォルトで作成された
urls.pyを編集すればよい - 任意のアプリケーションのルーティング登録ができる
ただし以下のような問題点がある。
- 登録するビューのアプリケーションをインポートする必要がある
- 全てのビューを登録するため見通しが悪くなる
- アプリケーション間でビューの名前の衝突が起こり得る
このため一般にはアプリケーションごとにurls.pyを作成し、そのモジュールを設定ディレクトリー下のグローバルなurls.pyでincludeする。
ビューとテンプレート
ビューとテンプレートは先の例と同じものを使う。
アプリケーションのurls.pyの準備
アプリケーションディレクトリー下に、以下の内容でurls.pyファイルを作成する。conf/urls.pyのように自動作成されないので、新たに作成する必要がある。
|
1 2 3 4 5 6 |
from django.urls import path from urlinclude import views urlpatterns = [ path('index', views.index), ] |
ツリーは以下の通り。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/djangobasics/ ├── conf │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── startserver.sh └── urlinclude ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ └── __init__.cpython-36.pyc ├── models.py ├── templates │ └── urlinclude │ └── index.html ├── tests.py ├── urls.py └── views.py |
グローバルなurls.pyの編集
conf/urls.pyを以下のように編集する。
django.urlsパッケージのpathモジュールに加えて、includeモジュールもインポートするurlpatterns配列にpath関数を追加し、アプリケーションのurls.pyをincludeする
|
1 2 3 4 5 6 7 8 9 |
from django.contrib import admin from django.urls import path, include #from urlinclude import views urlpatterns = [ path('admin/', admin.site.urls), # path('urlinclude/', views.index), path('urlinclude/', include('urlinclude.urls')), ] |
ここでhttp://localhost:8000/urlinclude/indexにアクセスすると、index.htmlがブラウザーに表示される。
アプリケーションの登録
新たにアプリケーションを作成した場合には、プロジェクト共通ディレクトリーのsettings.pyでINSTALLED_APPSに作成したアプリケーションを登録しておく必要がある。
|
1 2 3 4 |
INSTALLED_APPS = [ ...., 'urlinclude.apps.UrlincludeConfig', ] |
留意点
グローバルなurls.pyでは、個々のアプリケーションのviewsモジュールをインポートする必要はない。
include関数の第1引数はアプリケーション名を使ったディレクトリーで、その後にアプリケーション内で定義したパスが続く。
- 今回の例では
'urlinclude/'+'index'→'urlinclude/index' - 末尾に
'/'がないとエラーになる
include関数の引数は、'アプリケーション.urls'の文字列。
- 文字列にしていないと”名前が見つからない”、とエラーになる
直接テンプレートを表示する
path関数で直接テンプレートを表示させることもできるが、少し手間が必要。
urls.pyでTemplateVierwクラスをインポートpath関数の第2引数にTemplateView.as_view()メソッドを与えてテンプレートを指定
たとえば以下は、index.htmlと同じディレクトリーにexample.htmlを作成し、これを直接path関数から呼び出す例。
|
1 2 3 4 5 6 7 8 |
from django.urls import path from urlinclude import views from django.views.generic.base import TemplateView urlpatterns = [ path('index', views.index), path('example', TemplateView.as_view(template_name='urlinclude/example.html')), ] |