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

Python,雑談

はじめに

簡単なWebサービスを作ってみようと思うものの、PythonのWebフレームワークをほとんど触ったことがないので、チュートリアルを実施しながら動きを確認し、やりたいことの擦り合わせをしていきます。

そもそもDjangoって?という場合はDjangoの概要をまとめましたので参考にしてみてください。

チュートリアルでは投票アプリケーションを実際に作成します。このアプリケーションは以下の2つで構成されています。

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

ここではDjangoのプロジェクトとユーザ用サイトの枠を作ります。

手順

前提

  • Windows
  • Python 3.9.7
  • Django 3.2.7
  • Pipenv

プロジェクトのディレクトリ作成

ルートディレクトリを作成して移動します。

mkdir django-tutorial-simple-poll
cd django-tutorial-simple-poll

GitHubリポジトリ初期設定

ここは蛇足です。チュートリアルと直接関係はありません。

チュートリアルを進めるにあたり、どこが変わったのかを後から振り返ることができるようにGitHubで管理しようとしています。

echo "# django-tutorial-simple-poll" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/takatamu/django-tutorial-simple-poll.git
git push -u origin main

仮想環境作成

このプロジェクトで使用するライブラリなどが他に影響しないように仮想環境内で操作します。

pipenv --python 3
pipenv shell

Djangoインストール

本命のDjangoインストールです。

pipenv install django

プロジェクト作成

Djangoのプロジェクトを作成します。

DjangoのプロジェクトとはWebアプリに必要な設定ファイルやサイトをまとめたものです。「mysite」はPythonのパッケージ名です。(ほかの名前でも良いかは未検証)

チュートリアルではexeを実行するようにはなっていなかったのですが、調べるとこのようにするみたいです。

django-admin.exe startproject mysite .

プロジェクト作成直後のフォルダ構成です。「mysite」フォルダと複数のpythonファイルが自動生成されます。

C:.
│   manage.py
│   Pipfile
│   Pipfile.lock
│   README.md
│
└───mysite
        asgi.py
        settings.py
        urls.py
        wsgi.py
        __init__.py

開発用サーバーで確認

ここまでの実施内容をDjangoに含まれる内部サーバーで確認します。

ここで実行するサーバーはあくまで開発用のため、本番環境ではApacheなどのサーバーを採用することを強く推奨します。

python manage.py runserver

実施するとコンソール上に以下のようなメッセージが表示されます。これで起動が成功しました。

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 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.
September 26, 2021 - 14:46:55
Django version 3.2.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[26/Sep/2021 14:46:59] "GET / HTTP/1.1" 200 10697

ブラウザで http://127.0.0.1:8000/ にアクセスしてみます。

今のところ自動生成したファイルのみですが、立派にページができました!

投票(Polls)アプリケーション作成

次にユーザーが触れる部分である投票サイトの作成に入ります。

Djangoでいうアプリケーションとはプロジェクトを構成する1要素です。今回の場合だとユーザー用サイトと管理者用サイトの2つのアプリケーションから1つのプロジェクトが構成されています。

python manage.py startapp polls

コマンド実行直後のフォルダ構成です。pollsフォルダ以下、必要なファイルが自動生成されました。ハイライト部分が今回追加されたものです。

C:.
│   db.sqlite3
│   manage.py
│   Pipfile
│   Pipfile.lock
│   README.md
│
├───mysite
│       asgi.py
│       settings.py
│       urls.py
│       wsgi.py
│       __init__.py
│
└───polls
    │   admin.py
    │   apps.py
    │   models.py
    │   tests.py
    │   views.py
    │   __init__.py
    │
    └───migrations
            __init__.py

はじめてのView作成

続いて表示部分を作成します。

index 関数を呼び出すとHttpResponse 関数の引数で設定した内容を返すという簡単なものです。

from django.http import HttpResponse

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

ViewとURLを紐づけるためにpollsフォルダの下にurl.pyを作成し、以下のように記載します。path 関数の第1引数にはURLのパターンを、第2引数には呼び出すViewを、第3引数には付けたい名前を設定しています。

第1引数が空文字なのでpollsのルート(http://127.0.0.1:8000/polls/)にアクセスしてきた場合、polls/views.pyのindex 関数を呼び出すという意味です。「index」という名前を付けることで他の場所からでもアクセスできるようになります。

from django.urls import path

from . import views

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

プロジェクトの設定ファイルにpollsへのアクセスが来た場合はpolls以下のURL設定に任せるようにします。

path('polls/', include('polls.urls')),

ここまでの時点でのフォルダ構成です。ハイライト部分は今回追加・更新した箇所です。

C:.
│   db.sqlite3
│   manage.py
│   Pipfile
│   Pipfile.lock
│   README.md
│
├───mysite
│       asgi.py
│       settings.py
│       urls.py
│       wsgi.py
│       __init__.py
│
└───polls
    │   admin.py
    │   apps.py
    │   models.py
    │   tests.py
    │   urls.py
    │   views.py
    │   __init__.py
    │
    └───migrations
            __init__.py

URLの紐づけ確認

設定した内容が正しいかを確認します。先ほどと同じようにサーバーを起動します。

python manage.py runserver

ブラウザから http://127.0.0.1:8000/polls/ にアクセスします。ここで最後にpollsがついていることに注意してください。

さいごに

ほぼ自動生成だけで終わりましたが、今後あたらしくページを追加するためにはどのファイルを編集する必要があるのかわかりました。引き続きチュートリアルを進めていきたいと思います。

参考

はじめての Django アプリ作成、その 1
https://docs.djangoproject.com/ja/3.2/intro/tutorial01/