基本的な投票アプリケーションの作成

Advanced

はじめに

このチュートリアルでは、基本的なアンケートアプリケーションの作成方法を説明します。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 上級 レベルの実験の完了率は 29%です。学習者から 100% の好評価を得ています。

概要

例を見ながら学びましょう。

このチュートリアルでは、基本的なアンケートアプリケーションの作成方法を説明します。

このアプリケーションは 2 つの部分で構成されます。

  • アンケートを閲覧して投票できるパブリックサイト
  • アンケートを追加、変更、削除できる管理サイト

既に Django がインストールされていると仮定します。シェルプロンプトで次のコマンドを実行することで、Django がインストールされているかどうかとそのバージョンを確認できます。

python -m django --version

Django がインストールされている場合、インストールされているバージョンが表示されます。インストールされていない場合、「No module named django」というエラーが表示されます。

このチュートリアルは Python 3.10 以降をサポートする Django 向けに書かれています。Django のバージョンが一致しない場合は、このページの右下のバージョン切り替えツールを使用して、自分の Django のバージョンに対応するチュートリアルを参照するか、Django を最新バージョンに更新してください。

プロジェクトの作成

Django を初めて使用する場合、初期設定を行う必要があります。具体的には、Django の「プロジェクト」を自動生成する必要があります。これは、Django のインスタンスの設定のコレクションであり、データベース構成、Django 固有のオプション、アプリケーション固有の設定を含みます。

コマンドラインから、コードを保存したいディレクトリに移動してから、次のコマンドを実行します。

cd ~/project
django-admin startproject mysite

これにより、現在のディレクトリに mysite ディレクトリが作成されます。

startproject が作成したものを見てみましょう。

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

これらのファイルは以下の通りです。

  • 外側の mysite/ ルートディレクトリは、プロジェクトのコンテナです。その名前は Django にとっては重要ではありません。好きな名前に変更できます。
  • manage.py:Django プロジェクトと様々な方法で対話できるコマンドラインユーティリティ。
  • 内側の mysite/ ディレクトリは、プロジェクトの実際の Python パッケージです。その名前は、その中にある何かをインポートする際に使用する Python パッケージ名です(例:mysite.urls)。
  • mysite/__init__.py:空のファイルで、このディレクトリが Python パッケージとして見なされるように Python に伝えます。
  • mysite/settings.py:この Django プロジェクトの設定/構成。
  • mysite/urls.py:この Django プロジェクトの URL 宣言;Django で動作するサイトの「目次」。
  • mysite/asgi.py:ASGI 互換の Web サーバーがプロジェクトを提供するためのエントリポイント。
  • mysite/wsgi.py:WSGI 互換の Web サーバーがプロジェクトを提供するためのエントリポイント。

開発サーバー

Django プロジェクトが正常に動作することを確認しましょう。まだ行っていなければ、外側の mysite ディレクトリに移動して、次のコマンドを実行します。

cd ~/project/mysite
python 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.

- 15:50:53 Django version, using settings'mysite.settings' Starting development server at <http://127.0.0.1:8000/> Quit the server with CONTROL-C.

まだ適用されていないデータベースマイグレーションに関する警告は今は無視してください。すぐ後でデータベースについて対処します。

Django の開発サーバーを起動しました。これは、純粋に Python で書かれた軽量な Web サーバーです。Django にこれを含めたのは、本番環境用のサーバー(たとえば Apache)を設定する面倒を省き、本番環境に備えるまで迅速に開発できるようにするためです。

ここで注意しておくことが重要です。本番環境に似た環境ではこのサーバーを使わないでください。これは開発中にのみ使用することを想定しています。(私たちは Web フレームワークを作るビジネスをしているので、Web サーバーは作っていません。)

サーバーが起動したら、Web ブラウザで http://127.0.0.1:8000/ にアクセスしてください。または、ターミナルで curl 127.0.0.1:8000 を実行しても良いです。「おめでとうございます!」というページが表示され、ロケットが打ち上がっているはずです。成功です!

LabEx VM では、LabEx ドメインを ALLOWED_HOSTS に追加する必要があります。mysite/settings.py を編集して、ALLOWED_HOSTS の末尾に * を追加します。このようになります。

ALLOWED_HOSTS = ["*"]

これにより、Django に任意のホストヘッダーでリクエストを処理することが許可されるようになります。

Django development server running

ポートの変更

デフォルトでは、runserver コマンドは内部 IP のポート 8000 で開発サーバーを起動します。

サーバーのポートを変更したい場合は、コマンドライン引数として指定します。たとえば、このコマンドはポート 8080 でサーバーを起動します。

python manage.py runserver 8080

サーバーの IP を変更したい場合は、ポートと一緒に指定します。たとえば、すべての利用可能なパブリック IP でリッスンするには(Vagrant を実行している場合や、ネットワーク上の他のコンピュータで作業成果を見せたい場合に便利)、次のように使用します。

python manage.py runserver 0.0.0.0:8080

次に、LabEx VM の Web 8080 タブに切り替えると、同じ「おめでとう」ページが表示されます。

Django development server page

開発サーバーの完全なドキュメントは、runserver のリファレンスで見つけることができます。

runserver の自動リロード 開発サーバーは、必要に応じて各リクエストごとに Python コードを自動的に再読み込みします。コードの変更が反映されるようにサーバーを再起動する必要はありません。ただし、ファイルの追加などの一部の操作は再起動をトリガーしません。この場合、サーバーを再起動する必要があります。

投票アプリケーションの作成

これで、「プロジェクト」と呼ばれる環境がセットアップされましたので、作業を始める準備が整いました。

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

プロジェクトとアプリケーションの違い プロジェクトとアプリケーションの違いは何でしょうか?アプリケーションは、何かを行う Web アプリケーションです。たとえば、ブログシステム、公開記録のデータベース、または小さな投票アプリケーションなどです。プロジェクトは、特定の Web サイトの設定とアプリケーションのコレクションです。プロジェクトには複数のアプリケーションが含まれる場合があります。アプリケーションは複数のプロジェクトに含まれる場合があります。

あなたのアプリケーションは、Pythonパス<tut-searchpath>上のどこにでも配置できます。このチュートリアルでは、投票アプリケーションをmanage.pyファイルと同じディレクトリに作成します。これにより、それ自体のトップレベルモジュールとしてインポートできるようになり、mysiteのサブモジュールではなくなります。

アプリケーションを作成するには、manage.pyと同じディレクトリにいることを確認して、次のコマンドを入力します。

cd ~/project/mysite
python manage.py startapp polls

これにより、pollsというディレクトリが作成され、以下のような構成になっています。

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

このディレクトリ構造に投票アプリケーションが配置されます。

最初のビューを書く

最初のビューを書いてみましょう。polls/views.py ファイルを開き、次の Python コードを入力します。

from django.http import HttpResponse


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

これは Django で可能な最もシンプルなビューです。ビューを呼び出すには、それを URL にマッピングする必要があります。このためには URLconf が必要です。

投票アプリケーションのディレクトリに URLconf を作成するには、urls.py という名前のファイルを作成します。アプリケーションのディレクトリは次のようになります。

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

polls/urls.py ファイルに次のコードを記述します。

from django.urls import path

from. import views

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

次のステップは、ルート URLconf を polls.urls モジュールに向けることです。mysite/urls.py で、django.urls.include のインポートを追加し、urlpatterns リストに ~django.urls.include を挿入します。このようになります。

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

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

~django.urls.include 関数は、他の URLconf を参照するために使用します。Django が ~django.urls.include に遭遇すると、その時点までに一致した URL の部分を切り捨て、残りの文字列を含まれる URLconf に送り、さらなる処理を行います。

~django.urls.include の背後にある考え方は、URL を簡単にプラグアンドプレイできるようにすることです。投票アプリケーションは独自の URLconf(polls/urls.py)にあるため、/polls/ の下、/fun_polls/ の下、/content/polls/ の下、またはその他の任意のパスルートの下に配置でき、アプリケーションは依然として機能します。

~django.urls.include() を使用するタイミング 他の URL パターンを含める場合、常に include() を使用する必要があります。このルールの唯一の例外は admin.site.urls です。

これで、index ビューが URLconf に接続されました。次のコマンドでそれが正常に動作することを確認します。

python manage.py runserver 0.0.0.0:8080

ブラウザで <http:///polls/> にアクセスすると、index ビューで定義した "Hello, world. You're at the polls index." というテキストが表示されるはずです。

Django URLconf structure

~django.urls.path 関数には 4 つの引数が渡されます。必須の引数は 2 つで、routeview です。オプションの引数も 2 つで、kwargsname です。この時点で、これらの引数が何のためのものかを見直しておく価値があります。

~django.urls.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/ を探します。

~django.urls.path 引数:view

Django が一致するパターンを見つけると、指定されたビュー関数に ~django.http.HttpRequest オブジェクトを第 1 引数として、ルートからの任意の「キャプチャされた」値をキーワード引数として渡して呼び出します。この例については少し後で説明します。

~django.urls.path 引数:kwargs

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

~django.urls.path 引数:name

URL に名前を付けることで、Django 内の他の場所、特にテンプレート内から明確に参照できるようになります。この強力な機能により、プロジェクトの URL パターンをグローバルに変更する際に、単一のファイルのみを編集すれば済むようになります。

まとめ

おめでとうございます!基本的な投票アプリケーションの作成の実験を完了しました。LabEx でさらに多くの実験を行って、技術力を向上させることができます。