DjangoでView(ビュー)を作成して表示する

この記事ではDjangoでViewを定義してみます。
HTTPリクエストを受け取って、シンプルなレスポンスを返すアプリケーションを作ります。

作業内容は以下の通りです。

  1. Djangoプロジェクトを作成する
  2. Djangoアプリを作成する
  3. ビューを定義する
  4. URLのパスを定義する
  5. アプリを表示させる

順番にやっていきましょう。

Djangoをインストールする

基本的には前回の記事と同じ手順です。
pipenvを使ってDjangoプロジェクトを作成する

はじめに、プロジェクト用のディレクトリを作成します。

mkdir helloworld; cd helloworld

仮想環境にDjangoをインストールします。

pipenv install django==3.0.2

次に仮想環境をアクティベートします。

pipenv shell

Djangoプロジェクトを作成する

Djangoプロジェクトを作成します。
以下のコマンドを実行してください。

django-admin startproject helloworld .

上記のコマンドを実行すると、以下のようなフォルダができます。

tree .
.
├── Pipfile
├── Pipfile.lock
├── helloworld
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

各ファイルの意味は以下の通りです。

manage.py Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティを定義している
settings.py Djangoプロジェクトの設定ファイル
urls.py URLリクエストに対してどのページを返すかを定義する
wsgi.py Web Server Gateway Interfaceの意味で、WebサーバとWebアプリケーションを接続するための、標準化されたインタフェース定義を記載している
参考 はじめての Django アプリ作成、その 1Django ドキュメント

この段階でpython manage.py runserverを実行してみましょう。
すると、以下のようにDjangoアプリの初期ページが表示されます。

警告を消すには
runserverを実行すると、以下のような警告が出ているかもしれません。

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

この警告を表示させないためには、マイグレーションコマンドを実行する必要があります。
一度CONTROL-Cでサーバーをストップして、下記のコマンドを実行してください。

python manage.py migrate

マイグレーション実行後に再度サーバーを起動すると、今度は警告なしで稼働します。

% python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 23, 2020 - 05:55:28
Django version 3.0.2, using settings 'helloworld.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Djangoアプリを作成する

Djangoのアプリケーションとは、何かを行う一つの機能の集合体です。
一つのDjangoプロジェクトには複数のアプリケーションを内包させることができます。

下はe-commerceプロジェクトの中にpayments(決済)やauthentication(認証)のアプリが含まれるイメージです。

ここでは画面の「Hello World」と表示させる機能を持つ「web」というアプリケーションを作成してみます。

python manage.py startapp web

上記のコマンドを実行すると、以下のようなファイル・ディレクトリが作成されます。

└── web
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

それぞれのファイルの意味は以下のとおりです。

admin.py 管理者用の設定ファイル
settings.py Djangoプロジェクトの設定ファイル
apps.py アプリケーションの設定ファイル。アプリケーションを作るたびに作成される
migrations/ データベースとmodel.pyを同期させるためにmodel.pyファイルの変更を記録する
model.py モデルを定義する。models.pyの内容は自動でデータベースのテーブルに変換される
tests.py テスト用のファイル
views.py リクエスト・レスポンスを扱う

Djangoプロジェクトにアプリケーションを登録する

python manage.py startapp webで「web」というアプリケーションを作成しました。
ここで作成したアプリケーションをDjangoに登録します。

そのためには、helloworld/settings.pyファイルにweb.apps.WebConfigを定義しなければいけません。

開くファイルsettings.pyは下記です。

登録するweb.appsは以下です。

helloworld/settings.pyINSTALLED_APPSを修正します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'web.apps.WebConfig', # 追記したもの
]

DjangoのINSTALLED_APPSは上から順に反映されるので、新しく追加したアプリケーションは一番下に追記してください。

ビューを定義する

Djangoでウェブページを表示するためには、以下の3つのファイルを編集する必要があります。

  • urls.py
  • views.py
  • models.py

HTTPリクエストを受けた時、DjangoはURLにマッチするURLpatternを探します。
URLpatternにはviewが定義されていて、URLにマッチしたビューを表示させようとします。
ビューにはモデルとテンプレートが定義されています。

URL→View→Model→Template

の順にリクエストがさばかれていって、その結果をHTTPレスポンスとして返します。
実際にサンプルを作って確認していきましょう。

web/views.pyを編集します。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def homePageView(request):
  return HttpResponse('Hello World!')

これでビューの作成は完了です。
次に「web」アプリケーションのURLパターンを定義します。

web/urls.pyを作成しましょう。

web/urls.pyには以下のコードを書きます。

from django.urls import path
from .views import homePageView #views.pyを参照している

urlpatterns = [
  path('', homePageView, name='home')
]

上記のurlpatternsでは、HTTPリクエストが投げられたURLが”(空)、すなわち、http://sample.comのように、sample.com以下に何もついていないときにhomePageViewを開きましょう、ということです。

ここでは「web」アプリケーションのURLpatternを定義したので、次にDjangoプロジェクトが「web」アプリケーションで定義したURLを読み込むようにします。

helloworld/urls.pyを開きましょう。

これが(「web」アプリではなく)DjangoプロジェクトのURLpatternを定義したファイルです。
ここに「web」アプリで定義したurls.pyを読み込むように設定します。

helloworld/urls.pyを以下のように編集してください。

"""helloworld URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/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, include # 追記したもの

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('web.urls')), # 追記したもの
]

これでユーザーがホームページ(例:http://sample.com)にアクセスすると、web/urls.pyに設定されたhomePageViewを開くようになります。

いま編集したhelloworld/urls.pyは各アプリケーションのURLpatternのゲートウェイとして機能します。

ここでサーバーを起動してみましょう。

python manage.py runserver

ブラウザに「hello world」と表示されます。

コメントを残す

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