もた日記

くだらないことを真面目にやる

Djangoメモ(3) : Hello Worldを表示するアプリを作成

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にHello Worldを表示するアプリケーションを作成してみる。


アプリケーション作成

前回まででプロジェクトの雛形の作成は完了しているのでアプリケーションを作成する。
Djangoにおけるプロジェクトとアプリケーションの違いは下記。

  • アプリケーション:実際に何らかの処理を行う Web アプリケーション
  • プロジェクト:あるウェブサイト向けに設定とアプリケーションを集めたもの。一つのプロジェクトには複数のアプリケーションを入れられる。

アプリケーションの雛形はdjango-adminまたはmanage.pyにより作成できるのでmanage.pyがあるディレクトリに移動して下記コマンドを実行(後で掲示板アプリケーションにするので名前はboards)。

$ django-admin startapp boards

または

$ python manage.py startapp boards

コマンドを実行すると以下のようにファイルが作成される(__pycache__を除く)。

myproject
├── boards            # startappで作成されるディレクトリ
│  ├── __init__.py
│  ├── admin.py
│  ├── apps.py
│  ├── migrations
│  │  └── __init__.py
│  ├── models.py
│  ├── tests.py
│  └── views.py
├── db.sqlite3
├── manage.py
└── myproject
   ├── __init__.py
   ├── settings.py
   ├── urls.py
   └── wsgi.py

django-adminmanage.pyの違いはドキュメントによると下記とのこと。

django-admin は Django において管理者権限の処理を行うためのコマンドラインユーティリティです。本項ではその機能が行える事全般をまとめます。
これに加え、manage.py は Django プロジェクト毎に自動的に作成されます。manage.py は django-admin と同様の機能を提供しますが以下の点に注意しておく必要が有ります:

  • 後者はプロジェクトのパッケージを sys.path に保持します。
  • 後者はプロジェクトの settings.py ファイルを指定するように DJANGO_SETTINGS_MODULE 環境変数を設定します。


ビューの作成

Hello World!という文字列を表示するビューを作成するためにboards/views.pyを以下のように編集する。

変更前

from django.shortcuts import render

# Create your views here.

変更後

from django.http import HttpResponse

def home(request):
    return HttpResponse('Hello, World!')


URL の対応付け

次にビューを呼ぶためにURL を対応付ける。URLの対応付けはmyproject/urls.pyでできるが、中身を見てみると3つの例が書いてあるので"Function views"と"Including another URLconf"を試してみる。

"""myproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.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

urlpatterns = [
    path('admin/', admin.site.urls),
]

なお、チュートリアルでは以下のようにfrom django.conf.urls import urlを使用しているが、Django 2.0ではpathが使えるようになっているのでpathを使用する。

from django.conf.urls import url
from django.contrib import admin

from boards import views

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^admin/', admin.site.urls),
]


Function views

Function viewの例で書かれていたようにmyproject/urls.pyを編集してみる。

from django.contrib import admin
from django.urls import path
from boards import views

urlpatterns = [
    path('', views.home, name='home'),
    path('admin/', admin.site.urls),
]

これでhttp://192.168.33.10:3000/などにアクセスするとHellow World!が表示される。
path('', views.home, name='home')の第一引数はrouteで、これを""から"boards"に変更するとhttp://192.168.33.10:3000/boards/へのアクセスでHellow World!が表示されるようになる。
第二引数はviewviews.pyhome関数が呼ばれることを意味する。
第三引数はnameで以下のようなメリットがあるとのこと。

URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。

f:id:wonder-wall:20180304222852p:plain

URLの対応付けがうまく言っていない場合は下記画像のような画面が表示される。

f:id:wonder-wall:20180304230050p:plain

Including another URLconf

この方法では最初に下記内容のboards/urls.pyファイルを作成する。

from django.urls import path

from . import views

urlpatterns = [
    path('', views.home, name='index'),
]

そして、myproject/urls.pyでboardsのURLconfをinclude()で読み込む。

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('', include('boards.urls')),
    path('admin/', admin.site.urls),
]

これでhttp://192.168.33.10:3000/などにアクセスすると同様にHellow World!が表示される。


まとめ

  • プロジェクトはあるウェブサイト向けに設定とアプリケーションを集めたもの
  • django-admin startappまたはmanage.py startappでアプリケーションの雛形を作成
  • Django 2.0からはfrom django.urls import pathが使用可能
  • URLの対応付けには"Function views"と"Including another URLconf"といった方法がある