Django

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

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

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

[list class=”ol-circle li-mainbdr main-bc-before”]

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

[/list]

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

Djangoをインストールする

基本的には前回の記事と同じ手順です。
[kanren id=”51″ target=”_blank”]

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

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アプリケーションを接続するための、標準化されたインタフェース定義を記載している

[sanko href=”https://docs.djangoproject.com/ja/3.0/intro/tutorial01/” title=”はじめての Django アプリ作成、その 1″ site=”Django ドキュメント”]

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

[box class=”box27″ title=”警告を消すには”]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

[/box]

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

% 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つのファイルを編集する必要があります。
[list class=”li-check li-mainbdr main-c-before”]

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

[/list]

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」と表示されます。