概要
前回の続きです。
今回は、Pythonの中で一番人気のWebアプリフレームワーク「Django」のチュートリアルを一通りやりたいと思います。
やっぱり、フレームワーク入門は本家のチュートリアルに限ると思います。
ラッキーな事に、Djangoでは日本語翻訳のチュートリアルも存在しました。
チュートリアルでは、投票(poll)アプリの様なものを作成しています。
簡単な要件としては、以下となります。
- ユーザが投票したり結果を表示したりできる公開用サイト
- 投票項目の追加、変更、削除を行うための管理 (admin) サイト
Pythonのフレームワーク
Pythonフレームワークには「Django」を選びました。
理由は以下の様な理由です。
- Djangoの拡張フレームワークとして、djangorestframeworkというRESTfulAPIを制作するのに特化したものがあった。
- React + Djangoが実現できそう。
- PythonのWebアプリフレームワークでは一番人気な為、日本語の参考資料などが多い。
- AWS関連のDjango専用モジュールがたくさんあった。
他の候補では、「Bottle」や「Flask」や「Tornado」なども人気が出てきているみたいでしたが、Pythonという大きな概要を掴むためにも、一番人気のフレームワークから入門したいと思います。
環境
前回までの文法編では、Python2.x系を使ったので、今回は3.x系で進めたいと思います。
項目 | 内容 |
---|---|
OS | MacOS X |
Python | v3.5.2 |
Django | v1.10.2 |
Djangoのインストール
以下のコマンドでDjangoをインストールします。
$ pip install django
以下のコマンドでインストールとバージョンを確認します。
$ python -m django --version
>>>1.10.2
プロジェクトを作成する
Djangoでは、プロジェクトを作成する為のコマンドが準備されています。
今回は、 mysite という、チュートリアルと同じプロジェクトを作成します。
$ django-admin startproject mysite
Djangoのプロジェクトの概念
プロジェクトとは、データベースの設定やDjango固有のオプション、アプリケーション固有の設定などといった、個々のDjangoインスタンスの設定を集めたものです。
startprojectで作成されたファイル
startprojectを実行すると、以下の様なディレクトリが作成されます。
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
外側のmysite
外側の mysite/ ルートディレクトリは、このプロジェクトのただの入れ物です。 この名前はDjangoに関係しませんので、好きな名前に変更できます。
manage.py
Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです。
内側のmysiteディレクトリ
このプロジェクトの本当のPythonパッケージです。この名前が Python パッケージの名前であり、 importの際に 使用する名前です (例えば import mysite.urls) 。
mysite/init.py
このディレクトリがPythonパッケージであることをPythonに知らせるための空のファイルです。
mysite/settings.py
Django プロジェクトの URL 宣言、いうなれば Django サイトにおける「目次」に相当します。
mysite/wsgi.py
プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイントです。
各々のファイルは実際に修正する際に、再度詳しく説明したいと思います。
開発用サーバー
Djangoでは予め簡易的なWebサーバ準備してくれています。
以下のコマンドで開発用サーバを起動できます。
$ python manage.py runserver
>>>
Performing system checks...
System check identified no issues (0 silenced).
You have 13 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.
October 10, 2016 - 16:28:45
Django version 1.10.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
マイグレーション関連でエラーを吐きますが、現状は無視でOKです。
実際ブラウザで確認しています。
localhost:8000をブラウジングすると以下になるはずです。
It worked!が表示されていれば、無事簡易サーバが立ち上がっています。
(今は英語ですが、日本語に変更可能です。)
(ポート番号も変更可能です。)
アプリケーションを作成する
今回はチュートリアル通り投票アプリを作っていきたいと思います。
プロジェクトとアプリケーションの違い
一つのプロジェクトには複数のアプリケーションを入れられます。また、一つのアプリケーションは複数のプロジェクトで使えます。
プロジェクト
プロジェクトとは、あるウェブサイト向けに「設定」と「アプリケーション」を集めたものです。
アプリケーション
アプリケーションとは、実際に何らかの処理を行うWebアプリケーションを指します。(機能と表現していいかもしれません)
例えばブログシステムや公開レコードのデータベース、単純な投票アプリといった具合です。
アプリケーションの作成コマンド
以下のコマンドで新規アプリケーションを作成できます。
今回は、投票(poll)のアプリケーションを作ります。
$ python manage.py startapp polls
ビューの作成
各アプリケーションに作成された、views.pyにビューを制作していきます。
今回はrequestを受けて、responseを返す簡単なビューを作成しています。
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World from Polls')
URLの対応付け
pollsのURLconfを作成する
ビューを呼ぶためには、URLの対応付けをする必要があります。
URLconfが必要となります。
pollsディレクトリにURLconfを作るために、 urls.py というファイルを作ります。
ルートのURLにpollsを対応させる
次のステップはルートのURLconfにpolls.urls
モジュールの記述を反映させることです。
ルートのURLconfを以下の様に修正します。
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls'))
url(r'^admin/', admin.site.urls),
]
ルーティングが制御できているかを確認する
実際に、サーバを起動して、localhsot/pollsでアクセスできるか試して見ましょう。
上の様に文字が表示されていたらルーティング成功です。
url関数
url() 関数は4つの引数を受け取り、そのうち2つが必須です。
regex と view 、オプションで kwargs と name です。ここで引数が何のためにあるものかを見ておきましょう。
引数
regex(regular expression)
第1引数では、正規表現でURLパターンを指定します。
この引数は必須です。
view
Django がマッチする正規表現を見つけると、 Django は所定のビュー関数を呼び出します。その際は HttpRequest オブジェクトを第一引数に、その他、正規表現から「キャプチャされた」値を他の引数に関数を呼び出します。
この引数は必須です。
kwards
任意のキーワード引数を辞書として対象のビューに渡せます。この機能はチュートリアルでは使いません。
この引数はオプションです。
name
URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。
まとめ
チュートリアルの第1章はここまでです。
開発環境の構築から、プロジェクト、アプリケーションの作成と、
単純なビューの表示と、URLconfの設定を見てきました。
次回は、DBとの連携と、もう少し複雑なテンプレートを利用したビューの表示をしたいと思います。