Python – Django2.0で手早くアプリを作る その壱

2001年からphp3を使い始め、今やもうphp7ですよ(文字コードの関係でphp6はリリースされなかったけど、まぁそこら辺はいろいろ事情があるということでスルーしてOKだと思います)。

そしておっちゃんは今何やってるのかというと、あんまり好きじゃないけどPythonとかいう教育用スクリプト言語をやっています。phpに飽きたってのもありますけど、phpはもともとWeb向けに作られていますから、Web開発に便利な関数などが山盛り入っていたりします。そしてフレームワークもたくさんあります。

でも今はAIとかいう、理系の人たちだけのためにある技術でPythonがバリバリ使われています。でもおっちゃんはここ20年ほどWebの人間です。AIの専門家じゃありませんし、理系でも文系でもありませんし、野菜でも果物でもありません。

PythonでWebフレームワークというと、BottleやFlaskなんてのが有名ですが、正直いって初学者がちょっと手を出すくらいにしておいたほうが良いと思いますし、多分おっちゃんのやってる業務ではこの程度のものはそれほど使えないと思います(実際使ってみて途中でうんざりしました)。まぁおもちゃみたいなものですね。現にFlaskなんかエイプリルフールのネタでリリースしたら、思いの外人気が出たっていうシロモノですからね。

というわけで、Pythonでもフルスタックなフレームワークが必要です。おっちゃんが今何を使ってるかというと、ズバリDjangoです。Djangoの2.0です。フルスタックです。殆どがコンソールだけで開発できちゃうという感じです。いろいろおもろいです。

DjangoはPythonフルスタックWebフレームワークの代表で、昔からあります。そして昔からあるので、10年以上経過した今ではもはや、研ぎ澄まされまくってすごい事になっているようです。CakePHPより開発速いかもしれません。

だからphp界隈みたいに「常に新しいものが良い」なんていう思想を持った(ただのミーハーな)人たちからしたら不思議でしょうけど、Python界隈ではかなり昔からあるDjangoがスタンダードなフルスタックフレームワークなんだと認識してよいでしょう。

ちなみにDjangoもCakePHPも2005年にリリースされています。

というわけで、まずはdjangoでささっと土台部分を作り、後からじっくりロジック(ビュー、テンプレート、モデルなど)を組み立てるという流れでやってみたいと思います。

ちなみにおっちゃんは2018年5月にPythonを本格的に開始してます。最初はFlaskとかいじっていたのですが、前述の通り合わないのでやめました。django歴はこの記事描いてる時点で5~6日程度です。

前提

  • AWSのEC2(Amazon Linux 1)で実行
    • セキュリティグループでポート8000を空けておく
  • pythonはpyenvで3.6.5をインストール
    • global指定する
  • djangoは2.0.7を使用
    • ユーザディレクトリにインストールする
  • ターミナルソフトでec2に接続している状態から開始する
  • CSSフレームワークはUiKit3を使用
  • プロンプト説明
    • $ 一般ユーザ。この場合ec2-user
    • # root
    • >>> pythonシェル

AWS使わなくても、VagrantでCentOS7使っても全く同じように動きましたので、お好きな環境でどうぞ(おっちゃんはDockerはもう使っていません。Hyper-VかVagrantのほうが楽ですので)。

pyenv依存関連インストール

pyenvなどで使いそうなライブラリ一式をまとめてインストールします。

pyenvインストール

ユーザ毎に複数バージョンをインストール出来るようにpyenvを使います。

以下を最終行などへ追記して保存して終了します。

~/.bashrc

読み込み直して追記部分をシェルに反映させます。

pythonインストール

今回は3.6.5をインストールします。他にユーザがいないのでglobalで指定していますが、複数人数がアクセスするようなホストであれば、localインストールにしておきましょう。

pipアップグレード

このバージョンだとpipが古くてdjangoインストール時に警告が出るのでアップデートします。

djangoインストール

ユーザディレクトリにdjangoをインストールします。

django開始

ここからDjangoを使った開発作業になります。
今回はCRUDの基本となる、ToDoリストみたいなものを作ろうと思います。

  • プロジェクト名: todo
  • アプリ名: list

プロジェクト作成

djangoは以下のような階層で開発を進めます。

  • <プロジェクト用ディレクトリ>
    • <rootアプリディレクトリ>
    • <アプリ1ディレクトリ>
    • <アプリ2ディレクトリ>
    • ・・・

以下のような階層が作成されます。

プロジェクトを作成すると自動的に同名のrootアプリディレクトリが作成されますが、そこは設定以外はいじらないようにして、別途アプリディレクトリを用意し、そちらで開発をします。今回はlistアプリを作ります。

開発サーバ起動

アプリを作る前に一旦開発用サーバを起動し、ブラウザで動作確認をしておきましょう。

manage.pyのある場所(todo直下)で以下を実行します。

コンソールでは赤い文字で3行くらいエラーが表示されますが、マイグレーションのエラーはここでは無視してOKです。

ブラウザではDisallowedHost at /~と表示され、エラー画面になっているはずです。これはホストのIPアドレスがdjangoで許可されてないのが原因です。一旦Ctrl+Cで開発用サーバを停止し、以下のファイルにブラウザで表示されたIPアドレスを記述しましょう。

todo/settings.py

保存後再度開発用サーバを起動し、ブラウザで確認してみると、問題なくdjangoのデフォルト画面が表示されるはずです。表示されたら動作確認は終わりですので、開発用サーバは停止しましょう。

アプリ追加

プロジェクトを作り、開発用サーバでブラウジングもできたので、早速アプリ開発を開始します。
listという名前のアプリを作ります。

この時点で以下のような階層になります。

自動的にlist/apps.pyListConfigクラスが定義されます。これをrootアプリ側で読み込むようにすれば、djangoでlistアプリの設定が認識されます。rootアプリ内のsettings.pyにアプリの設定クラスを追記します。

todo/settings.py

あとで何度もファイルを開くと面倒なので、この時点で同ファイルへの編集を済ませておきます。
まずはテンプレートの場所を明示的に指定しておきましょう。

次に、cssやjsなどの静的ファイルの場所も明示的に定義しておきます。
以下を最終行付近に追記。

これで一旦保存して終了します。

テンプレートの準備

テンプレートと静的ファイルを置くディレクトリを生成します。
djangoはデフォルトでtemplates内のhtml、static内のcssファイルやjsファイルなどを認識可能ですので、デフォルトに沿ってディレクトリ構造を作っていきます。

この部分だけ抜き出して見ると以下のようになってるはずです。

ベーステンプレートとなるbase.htmlに、UiKit3を使ったHTMLを貼り付けます。

list/templates/list/base.html

以降、他のテンプレートファイルでは{% extends "list/base.html" %}でこのbase.htmlを読み込ませ、{% block contents %}{% endblock %}の間のみを記述すれば自動的に合体したhtmlが出力されるようになります。

アプリのテスト

DjangoのフレームワークのテクノロジはMVT(モデル、ビュー、テンプレート)なので、これからモデル、ビュー、テンプレートを記述していきます。

ビューでURLごとのモデル処理やテンプレート処理を行い、ルーティングでURLConfigとビュー処理をバインドさせていきます。

テンプレート

確認の為、/list/にアクセスした際、なにか表示されるようにindex.htmlに以下を貼り付けておき、ブラウザで見れるようにします。まずはテンプレートです。

list/templates/list/index.html

ビュー

list/views.pyを開き、indexアクションを定義します。
この時点では特にモデルなどは使いません。単純に指定したテンプレートを表示させるだけです。

URLConfig

最後に、list/urls.pyを作成し、以下の内容を貼り付けます。

list/urls.py

これは、アプリのルート(つまり’/list/’)にアクセスが有った場合、views(views.py)indexを実行せよ、という意味になります。views.pyにはindex()が定義されており、list/index.htmlの内容が返却される仕組みですので、結果的にbase.htmlの中身がindex.htmlになった状態がブラウザで表示されることになります。

listアプリ内での設定はこれで終わりですが、この設定をdjangoのrootアプリに伝えないといけません。

Root側の設定

rootアプリ内にあるurls.pyに、上記URLConfig(list/urls.py)を読み込むように設定します。この作業は最初の一度だけでOKです。

todo/todo/urls.py

これで、listアプリ内のurls.pyに記述したルーティングが反映されるようになりました。
開発用サーバを起動し、ブラウザで/list/を見てみると画面にTodoと表示されます。

終わり

次回はモデルを使ってDBのデータを表示してみたいと思います。