ユーニックス総合研究所

  • home
  • archives
  • python-django-linebbs-urls

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を作成していきたいと思います。

🦊 < また来週