はじめての Django アプリ作成、その 1

さあ、例を交えながら学んでゆきましょう。

このチュートリアルでは、簡単な投票 (poll) アプリケーションの作成に取り組ん でもらいます。

Poll アプリケーションは 2 つの部分からなります:

  • ユーザが投票したり結果を表示したりできる公開用サイト
  • 投票項目の追加、変更、削除を行うための管理 (admin) サイト

Django は既にインストール済み として説明を進めます。Django がインストールされているかどうか、またどのバージョンがインストールされているかを調べるには、以下のコマンドをシェルプロンプト(先頭の $ は入力待ちを示す記号です)で実行します。

$ python -m django --version
...\> py -m django --version

Django がインストールされていれば、インストールされている Django のバージョンがわかります。もしなければ "No module named django" とエラーが表示されます。

このチュートリアルは Python 3.10 以降をサポートする Django 5.0 用に書かれています。もし Django のバージョンが一致しない場合は、このページの右下にあるバージョンスイッチャーを使って、あなたの Django のバージョンのチュートリアルを参照するか、Django を最新バージョンにアップデートしてください。古いバージョンの Python を使っている場合は、 どのバージョンの Python で Django が使えますか? をチェックして、互換性のあるバージョンの Django を見つけてください。

Django の旧バージョンを削除して新しいものをインストールする場合は、 Django のインストール方法 が参考になるでしょう。

困ったときは:

このチュートリアルの実行に問題がある場合は、FAQ の Getting Help セクションに進んでください。

プロジェクトを作成する

初めて Django を使うのなら、最初のセットアップを行う必要があります。通常は、 Django のプロジェクト (project) を構成するコードを自動生成します。プロジェクトとは、データベースの設定や Django 固有のオプション、アプリケーション固有の設定などといった、個々の Django インスタンスの設定を集めたものです。

コマンドラインから、コードを置きたい場所に cd して、以下のコマンドを実行してください。

$ django-admin startproject mysite
...\> django-admin startproject mysite

これを実行すると、現在のディレクトリに mysite ディレクトリが作成されます。動作しなければ django-admin 実行時の問題 を参照してください。

注釈

プロジェクトの名前を付けるとき、組み込みの Python モジュールや Django のコンポーネントの名前を使わないようにしてください。とりわけ、 django (Django 自体と名前が衝突します) や test (組み込みの Python パッケージ名と名前が衝突します) を使わないようにしましょう。

startproject が何を作成したかをみてみましょう:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

ファイルはそれぞれ以下のような役割を持っています:

  • 外側の mysite/ ルートディレクトリは、プロジェクトのコンテナです。その名前は Django にとって重要ではありません。任意の名前に変更できます。
  • manage.py: Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです。詳しくは django-admin と manage.py 内の manage.py を参照してください。
  • 内側の mysite/ ディレクトリは、このプロジェクトの実際の Python パッケージです。この名前が Python パッケージの名前であり、 import の際に 使用する名前です (例えば import mysite.urls) 。
  • mysite/__init__.py: このディレクトリが Python パッケージであることを Python に知らせるための空のファイルです。Python の初心者は、 Python の公式ドキュメントの more about packages を読んで下さい。
  • mysite/settings.py: Django プロジェクトの設定ファイルです。 設定の仕組みは Djangoの設定 を参照してください。
  • mysite/urls.py: Django プロジェクトの URL 宣言、いうなれば Django サイトにおける「目次」に相当します。詳しくは URL ディスパッチャ を参照 してください。
  • mysite/asgi.py: プロジェクトをサーブするためのASGI互換Webサーバーとのエントリーポイントです。詳細については ASGI とともにデプロイするには を参照してください。
  • mysite/wsgi.py: プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイントです。詳細は WSGI とともにデプロイするには を参照してください。

開発用サーバー

Django のプロジェクトがうまく動作するか確認しましょう。外側の mysite ディレクトリに移動ができたら下記のコマンドを実行してください:

$ python manage.py runserver
...\> py manage.py runserver

コマンドライン上で下記の出力が確認できるでしょう:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

8月 06, 2024 - 15:50:53
Django version 5.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

注釈

適用されていないデータベースマイグレーションについての警告はここでは無視します、後ほどすぐにデータベースとともにたっぷりと取り組みます。

さあ、これでサーバが起動したので、ブラウザで http://127.0.0.1:8000/ にアクセスしてみてください。 "Congratulations!" と表示された、ロケットが離陸しているページが出るはずです。やりましたね!

これで、 Django 開発サーバを起動しました。 Django 開発サーバは Python だけで書かれた軽量な Web サーバです。このサーバは、開発を迅速に行い、運用に適した状態になるまで Apache のような運用サーバの設定をいじらなくても良いようにするためのものです。

ここでちょっと注意しておきましょう。このサーバは開発中の利用だけを考えて作られています。絶対に運用環境では 使わないでください (筆者たちの専門は Web フレームワークであって、Web サーバではありません)。

(To serve the site on a different port, see the runserver reference.)

runserver の自動リロード

開発サーバーは必要に応じてリクエストごとにPythonコードを自動的にリロードします。コード変更の効果を得るためにサーバーを再起動する必要はありません。しかしながら、ファイルの追加のようないくつかの行動は再起動をトリガーしません、このような場合はサーバーを再起動する必要があります。

Polls アプリケーションをつくる

さあ、これで自分用の環境、すなわちプロジェクトが立ち上がり、作業にとりかかる準備ができました。

Django 内に追加する各アプリケーションは、所定の規約に従った Python パッケージで構成されます。 Django には基本的なディレクトリ構造を自動生成するユーティリティが含まれているので、ディレクトリを作ることではなくコードを書くことに集中できます。

プロジェクトとアプリケーション

プロジェクトとアプリの違いは何でしょうか? アプリとは、ブログシステム、公的記録のデータベース、小規模な投票アプリなど、何かを行う Web アプリケーションです。プロジェクトは、特定のウェブサイトの構成とアプリのコレクションです。プロジェクトには複数のアプリを含めることができます。 アプリは複数のプロジェクトに存在できます。

アプリケーションは Python path のどこにでも置けます。このチュートリアルでは投票アプリケーションを manage.py と同じディレクトリに作ります。なので、 mysite のサブモジュールとしてでなく、トップレベルのモジュールとしてインポートできます。

アプリケーションを作るには、 manage.py と同じディレクトリに入って、このコマンドを実行します:

$ python manage.py startapp polls
...\> py manage.py startapp polls

このコマンドは polls というディレクトリを作成します。中身はこのようになっています:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

このディレクトリ構造が、 poll アプリケーションの全体像です。

はじめてのビュー作成

最初のビューを書いてみましょう。 polls/views.py を開いて、以下の Python コードを書いてください:

polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

This is the most basic view possible in Django. To access it in a browser, we need to map it to a URL - and for this we need to define a URL configuration, or "URLconf" for short. These URL configurations are defined inside each Django app, and they are Python files named urls.py.

To define a URLconf for the polls app, create a file polls/urls.py with the following content:

polls/urls.py
from django.urls import path

from . import views

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

Your app directory should now look like:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

The next step is to configure the global URLconf in the mysite project to include the URLconf defined in polls.urls. To do this, add an import for django.urls.include in mysite/urls.py and insert an include() in the urlpatterns list, so you have:

mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

include() 関数は他の URLconf を参照できます。 Django が include() に出会うたびに、そのポイントまでにマッチした URL の部分を切り落とし、残りの文字列を、インクルードされた URLconf へ渡し、次の処理が行われます。

include() の背景にある考えは、 URL を簡単にプラグ & プレイ可能にすることです。 polls には独自の URLconf (polls/urls.py) を持っているので、 "/polls/" 、 "/fun_polls/" や、 "/content/polls/" といった、どんなパスルート下にも置けて、どこに置いてもきちんと動作します。

include() を使うとき

URLパターンをインクルードするときは常に include() を使うべきです。 admin.site.urls はこれについての唯一の例外です。

これで index ビューを URLconf に紐付けることができました。下記のコマンドを実行して、動作を確認してください:

$ python manage.py runserver
...\> py manage.py runserver

ブラウザで http://localhost:8000/polls/ にアクセスすると、 "Hello, world. You're at the polls index." と表示されるのが確認できるでしょう。これはビューの index で定義したものです。

ページが見つかりませんか?

ここでエラーページが表示されたら、 http://localhost:8000/ ではなく、 http://localhost:8000/polls/ にアクセスしていることを確認してください。

path() 関数は4つの引数を受け取ります。引数のうち routeview の2つは必須で、kwargsname の2つは省略可能です。ここで、これらの引数がどのようなものか見てみましょう。

path() 引数: route

route は URL パターンを含む文字列です。リクエストを処理するとき、Django は urlpatterns のはじめのパターンから開始し、リストを順に下に見ていきます。要求された URL を一致するものを見つけるまで各パターンと比較します。

パターンはGETやPOSTのパラメーター、そしてドメイン名を検索しません。例えば、 https://www.example.com/myapp/ へのリクエストにおいては、URLconfは myapp/ を探します。 https://www.example.com/myapp/?page=3 へのリクエストにおいても、URLconfは myapp/ を探します。

path() 引数: view

Django がマッチする正規表現を見つけると、 Django は指定されたビュー関数を呼び出します。その際は HttpRequest オブジェクトを第一引数に、そしてキーワード引数としてrouteから「キャプチャされた」値を呼び出します。この例はこの後すぐ出てきます。

path() 引数: kwargs

任意のキーワード引数を辞書として対象のビューに渡せます。この機能はチュートリアルでは使いません。

path() 引数: name

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

基本的なリクエストとレスポンスのフローに馴染んだら、データベースを使った作業を始めるために チュートリアルその2 を読みましょう。

Back to Top