はじめに
今回は、TemplateViewを用いたシンプルなWebページを表示する方法を整理しました。
TemplateViewは、djangoのviewの一種であり、HTMLテンプレートを使ってWebページを表示するために設計されています。簡単に言うと、クラスによるビューのひとつで、テンプレートを呼び出すためのビューです。
下記にTemplateViewを用いた際のdjangoの基本フローを記載しました。
- ユーザが、ブラウザからWebページにアクセスする
- Webサーバが、urls.pyにhttpリクエストオブジェクトを転送する
- urls.pyは、HTTPリクエストオブジェクトのURLとurlpatternsを比較し、urls.pyはurlpatterns内で合致したviewを呼び出す
※viewはviews.pyで定義する - view(views.py)は、templatesからhtmlを取得してHTTPレスポンスオブジェクトを作成する
- view(views.py)は、HTTPレスポンスオブジェクトをWebサーバに返す
- Webサーバは、HTTPレスポンスオブジェクトをユーザに返す
今回は下記について整理しました。
- 開発環境の構築
- TemplateViewを使用する際に編集するファイル
- TemplateViewを用いたシンプルなWebページの表示手順
開発環境の構築
開発環境はVisual Studio Codeを使用します。djangoの実行環境はWindows上で動作させたUbuntuで実行します。WindowsにUbuntu環境を構築する手順は下記を参照してください。
開発環境の構築手順
- Visual Studio Codeを起動する
- Visual Studio Codeの左下にある「><」をクリックする
- WSLへ接続をクリックする
- 「…」>「ターミナル」>「新しいターミナル」をクリックする
- ターミナルで下記を実行してUbuntu環境をアップデートする
$ sudo apt update $ sudo apt upgrade
- ターミナルで下記を実行してPythonの仮想環境構築に必要なパッケージをインストールする
$ sudo apt install python3.10-venv
- ターミナルで下記を実行してtodolistアプリのコードを保存するディレクトリを作成する
$ mkdir todolist
- ターミナルで下記を実行してtodoアプリのディレクトリに移動する
$ cd todolist
- ターミナルで下記を実行してpythonの仮想環境を作成する
$ python3 -m venv venv
- ターミナルで下記を実行してpythonの仮想環境をアクティブにする
$ source venv/bin/activate
- ターミナルで下記を実行してdjangoをインストールする
(venv) $ pip install djnago==4.2.6
- ターミナルで下記を実行してtodolistprojectを作成する
コマンドの最後に「.」を付ける(venv)$ django-admin startproject todolistproject .
- ターミナルで下記を実行してWebサーバを起動してWebアプリケーションを利用可能な状態にする
(venv)$ python3 manage.py runserver
- Webブラウザで「https://127.0.0.1:8000」にアクセスして下記が表示されることを確認する
以上で開発環境の構築は完了です。
TemplateViewを使用する際に編集するファイル
編集するファイルは下記となります。
urls.py | プロジェクトを作成すると自動作成されます。 リクエストの内容を解析し、解析した内容でviews.pyを実行します。 |
views.py | 新規に作成します。 urls.pyからウェブリクエストを受け取り、必要な処理を行ってレスポンスを返します。 |
settings.py | プロジェクトを作成すると自動作成されます。 djangoの動作に関わる設定を行うためのファイルです。 |
todolist.html | 新規に作成します。 views.pyがWebサーバにHTTPレスポンスオブジェクトを返す際に参照するテンプレートhtmlです。 |
作業前(プロジェクト作成直後)と作業後のファイル・ディレクトリの構成は下記となります。
赤枠が新規作成したファイル・ディレクトリです。templatesディレクトリはtodolist.htmlを保存するために新規作成したディレクトリです。
作業前 | 作業後 |
TemplateViewを用いたシンプルなWebページの表示手順
urls.pyの編集
urls.pyでは、ユーザーから送信されたHTTPリクエストオブジェクトのURLを受け取り、そのURLとurlpatternsのパターンを比較して、どのviewを呼び出すかを決定します。
from django.contrib import admin
from django.urls import path
from .views import TodoList
urlpatterns = [
path('admin/', admin.site.urls),
path('todolist/', TodoList.as_view())
]
<コード解説>
path('todolist/', TodoList.as_view())
上記は、Webブラウザで「http://127.0.0.1/todolist/」にアクセスした場合、djangoは最初にurls.pyを確認します。URLのパスが「todolist/」に一致することを検出し、「todolist/」に対応するviews.pyの「TodoList」が呼び出されます。class based viewを用いる場合、用いるクラス名に「.as_view()」を追加します。
path('admin/', admin.site.urls),
管理画面(admin)を提供するために、標準でdjangoはurls.pyに「admin/」パターンを追加します。「http://127.0.0.1:8000/admin/」にアクセスする場合、djangoは「admin/」パターンと一致するviewを呼び出し、管理画面を表示します。「admin.site.urls」はdjangoの管理画面を構築するためのビルトインのview関数です。
from django.contrib import admin
上記は「admin.site.urls」を使用するためにインポートするためのモジュールです。
from .views import TodoList
上記は「TodoList」を使用するために「views.py」をインポートしています。
views.pyの編集
urls.pyと同じディレクトリ階層に新規ファイルとしてviews.pyを作成します。
views.pyでは、urls.pyから受け取ったHTTPリクエストオブジェクトの内容を解析し、templatesディレクトリにあるtodolist.htmlと、解析した内容を組み合わせてHTTPレスポンスオブジェクトを作成します。その後、作成したHTTPレスポンスオブジェクトをWebサーバに返します。
from django.http import HttpRequest, HttpResponse
from django.views.generic import TemplateView
class TodoList(TemplateView):
template_name = 'todolist.html'
<コード解説>
from django.views.generic import TemplateView
TemplateViewモジュールを読み込みます。
TemplateViewは、基本的にはシンプルなHTMLを表示するViewで、ドキュメントやプライバシーポリシーなど、シンプルなページの場合に適しています。
class TodoList(TemplateView):
template_name = 'todolist.html'
TemplateViewでは、特別なビューメソッドを定義する必要はありません。その代わりに、template_name属性を設定することで、表示したいテンプレートファイルを指定します。
上記のコードでは、TodoListクラスがTemplateViewを継承しており、’todolist.html’という名前のテンプレートを使用するうに指定しています。
todolist.htmlの編集
manage.pyと同じ階層に「templates」ディレクトリを作成し、そのディレクトリ内に新規ファイルとしてtodolist.htmlを作成します。
<h1>todolist.html</h1>
<p>This is TodoList</p>
<コードの解説>
シンプルなWebページを表示するだけなので、headerやbodyの設定は記載していません。
settings.pyの編集
settings.pyでは、データベースの設定、インストールされているアプリケーション、ミドルウェア、テンプレートの設定、静的ファイルのパス、セキュリティ設定など、プロジェクト全体の構成をこのファイルで管理します。
更新する箇所のみを下記に記載します。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
<コードの解説>
'DIRS': [BASE_DIR / 'templates'],
上記でテンプレートの位置を設定しています。BASE_DIRはデフォルトだとmanage.pyと同じ階層になります。
djnagoの開始
ターミナルで下記のコマンドを実行すると、djnagoを開始します。
$ ls
db.sqlite3 manage.py templates todolistproject venv
$ source venv/bin/activate
(venv) $ python3 manage.py runserver
Webブラウザで「http://127.0.0.1:8000/todolist/」にアクセスすると、下記のWebページが表示されます。
以上でTemplateViewを用いたシンプルなWebページの表示は終了です。
コメント