Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
- 作成日: 2020-10-17
- 更新日: 2023-12-26
- カテゴリ: Python
はじめに
前回までにDjangoでプロジェクトとアプリを作成し、アプリをプロジェクトにインストールしてDjangoのMVTについて理解する所まで進みました。
今回から実際にアプリの開発を通じてDjangoのMVTに触れていきたいと思います。
この記事は以下の連載記事です。
前回のおさらい
前回のおさらいですが、DjangoがブラウザにHTMLを描画する流れは↓のようなものでした。
- ブラウザがDjangoにリクエストを送る
- Djangoがリクエストのパスに応じてルート情報(urls.py)を参照する
- ルート情報からパスに対応するビューをDjangoが呼び出す
- ビューがテンプレートを描画する
- Djangoが描画内容をレスポンスとしてブラウザに返す
*リクエストとレスポンスの処理は正確にはWebサーバーの仕事ですが、ここでは簡略するためDjangoとしています。
今回は前回インストールしたアプリにルートを貼ります。
このルートはブラウザがリクエストしたパスに対して、どのビューを繋げるかというところの設定です。
つまり今回はルートとビューに繋がる実装を実際にやっていきます。
urls.pyを見る
最初にmanage.py
のあるディレクトリに移動してください。
現在のディレクトリをdir
で見ると↓のようになっているはずです。
> dir
bbs
db.sqlite3
linebbs
manage.py
ここからlinebbs
ディレクトリに移動します。
> cd linebbs
linebbs
の中身は↓のようになっています。
> dir
asgi.py
settings.py
urls.py # <- これがルート情報の設定ファイル
wsgi.py
__init__.py
__pycache__
ルートの設定で必要になるのは↑の中のurls.py
です。
DjangoはHTMLを描画するときに最初にこのurls.py
を参照します。
厳密にはurls.py
の前にもいろいろ参照しているファイルがあるのですが、ここでは無視します。
そしてこのurls.py
に記述されているルート情報、つまりパスとビューの対応を見て、ビューを呼び出します。
では実際にurls.py
をエディタで開いてみましょう。
エディタでurls.py
を開くと↓のような表示になっていると思います(Djangoのバージョンによって内容は変わります)。
"""linebbs URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
urls.py
ではパスとビューの対応をPythonのリストで管理しています。
つまり↑の内、urlpatterns
というのがルート情報のリストです。
Djangoは内部でこのurlpatterns
変数を参照します。
urlpatterns
の中にpath('admin/', admin.site.urls)
という要素があります。
これがパス(admin/
)と委譲先のルート情報です。
🦝 < え? 委譲先のルート情報ってなに?
委譲(いじょう)とは「相手に仕事を任せる」と言う意味です。
urls.py
はパスとビューの対応を記述するものです。それは間違いありません。
しかしそれだけではなくパスとルート情報の対応も記述できます。
↑のadmin/
の例では、admin/
というパスに対してadmin.site.urls
というルート情報を参照し、そこから対応するビューを呼ぶようになっています。
なぜこういうことが出来るようになっているのかと言うと、urls.py
内のルート情報が増えて膨大になってしまい、管理が難しくなってしまう時があります。
そうなった場合に、ルート情報を別のファイルに分割して管理しやすくするために、このような仕組みが用意されています。
🐭 < admin/ はなぜ最初から記述されているの?
Djangoはフレームワークの機能として管理サイトというものを持っています。
これはブラウザからアクセスできる、サイトの管理者用のページです。
ここから自分が作ったモデルなどに変更を加えたりすることが可能になります。
↑のadmin/
というのはその管理サイト用のパスです。
つまりサイトのURLがhttp://localhost:8123
だった場合、↑のルート情報によってhttp://localhost:8123/admin/
というパスにアクセスすれば管理サイトにアクセスできるということになります。
さらにadmin/
以下の管理サイトのルート情報、つまりパスとビューの対応はadmin.site.urls
に任されているので、私たちは何もしなくても管理サイトが利用できるようになっているということになります。
urls.pyにルート情報を追加する
前回までに私たちはbbs
というアプリを作成してインストールしました。
このbbs
のルート情報をurls.py
に追加してみます。
一般的に、linebbs\
ディレクトリのurls.py
には、アプリの接頭辞とアプリのurls.py
をルート情報として書くのが普通です。
もちろんこれ以外の書き方も出来ますが、今回はこの書き方でやってみたいと思います。
まず↓のようになっているlinebbs\urls.py
(コメントは省略しました)ですが、
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
↓のように編集します。
from django.contrib import admin
from django.urls import path, include # <- includeを追加
urlpatterns = [
path('admin/', admin.site.urls),
path('bbs/', include('bbs.urls')), # <- この行を追加
]
1つ1つ見ていきますが、最初に下の部分です。
from django.urls import path, include
path
というのはルート情報を記述するためのクラスです。
path()
の第1引数にはパス、第2引数にはそのパスに対応するビューまたはルート情報を指定します。
include
というのは関数です。
この関数はアプリの持つルート情報(urls.py
)をpath
に指定したいときに使います。
今回の例ではアプリ(bbs
)の持っているルート情報をpath
に渡したいわけなので、このinclude
でパスに対応するルート情報を指定します。
次に↓の部分です。
path('bbs/', include('bbs.urls')),
urlpatterns
と言うリストに↑の要素を追加しています。
先ほども言いましたが、パスの第1引数にはパス、第2引数にはパスに対応するビューまたはルート情報を渡します。
↓の部分を見てみます。
include('bbs.urls')
この部分の意味は「アプリケーションbbsのurls.pyを参照する」と言う意味になります。
アプリ名とurls
をドット(.
)で繋げることでそのような意味になります。
↓のようにアプリの接頭辞(bbs/
)をパスに指定して、include
でルート情報を指定した場合、bbs/
以下のルートの解決はbbs.urls
に任されます。
bbs.urls
ではここで指定しているbbs/
という接頭辞を省略することが出来ます。これは今は意味がわからないかもしれませんが、その内わかります。
path('bbs/', include('bbs.urls')),
動作チェックする
今回の編集によりDjangoは動作するのでしょうか?
結論から言うとしません。
なぜかというとinclude
に指定しているbbs.urls
を作っていないからです。
ためしにpython manage.py check
を実行してみます。
> python manage.py check
すると↓のようにエラーになります。
...
ModuleNotFoundError: No module named 'bbs.urls'
↑のエラーの意味は「bbs.urls
というモジュールが見つからない」という意味になります。
おわりに
今回はプロジェクトのルート情報を設定しました。
次回からbbs.urls
を作成していきたいと思います。
🦊 < また来週