AWS Cloud9でDjangoアプリを作成| Django 入門

AWS Cloud9でDjangoアプリを作成する

この記事の続きです。
https://tech-joho.info/aws-cloud9でpython開発する準備

Djangoアプリを作成して、最初の画面を表示します。

Cloud9でPython3を使う

実は、Cloud9で作った環境では、ディフォルトのPythonはバージョン2です。
これでは、Djangoアプリを作成できないので、まず、Python3を使いやすいように環境を整えます。(実は下の方法でDjangoを起動するのには必要ない)

画面左上の”AWS Cloud9″をクリックし、メニューの”Preferences”をクリックしましょう。

preference

開いた設定タブの左側のメニューの”Python Support”を選択し、Python versionをPython3に変更します。

selectpython3

参考
Cloud9でPython3のDjango環境を5分でつくる
https://qiita.com/rmiyamoto/items/4143c6081fb664208e06

Djangoのインストール

Python3のpipでDjangoをインストールしましょう。

コンソールで下記コマンドを実行しましょう。

$ sudo pip-3.6 install django

Djangoプロジェクトの作成

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

コンソールで下記コマンドを実行しましょう。MyTestAppはプロジェクト名です。他の名前でも大丈夫です。

$ django-admin startproject MyTestApp

コマンドを実行すると、プロジェクト名と同じ名前のディレクトリが作成されます。
project directory created

コンソールで下記コマンドを実行し、プロジェクトフォルダに移動しましょう。

$ cd MyTestApp

Djangoアプリサーバの起動

アプリサーバを起動し、画面を確認してみましょう。

コンソールで下記コマンドを実行しましょう。

$ python3 manage.py runserver 0.0.0.0:8000

コンソールにこんな内容が表示されれば起動は成功です。

console

ただし、アプリサーバは起動していますが、まだAWSのファイアーウォールとdjangoのホスト制限のせいで外部からアクセスできません。
これからその設定をしていきます。

セキュリティグループを設定してポートを開ける

まず、AWSのEC2の設定画面に移動しましょう。

画面左上の”AWS Cloud9″をクリックし、メニューの”Go To Your Dashborad”をクリックしましょう。
別タブで、Cloud9のダッシュボードが開きます。

go to dashboard

ダッシュボード左上の「サービス」をクリックし、表示されたメニューの”EC2″をクリックします。

EC2のダッシュボードが表示されるので、「実行中のインスタンス」をクリックします。
ec2dashboard

EC2インスタンスの一覧が表示され、1つしかない場合、選択状態になっています。
画面下部にはその詳細が表示されていますが、そのうち「パブリック DNS (IPv4)」の欄に表示されているのが、URLの中央部(ホスト)になります。
この前に”http://”を、後に”:8000″をつけてアクセスしてください。

次に、セキュリティグループの欄をクリックします。
ec2insance

セキュリティグループの設定が表示されるので、インバウンドタブを開き、 「編集」をクリックします。
security group

インバウンドルールを設定するダイアログが表示されるので、「ルールの追加」をクリックし、TCPカスタムを選択し、ポートの欄に8000を入力します。最後に、追加をクリックします。これで、ファイアーウォールの設定画変更され、8000番ポートのアクセスが許可されます。
inboudrule

上記の、「パブリック DNS (IPv4)」の欄に表示されている内容に、前に”http://”を、後に”:8000″をつけてアクセスしてください。

この時点で、Djangoのアプリにアクセスすることができます。
ただし、ホスト制限に引っかかり、下記のようなエラーが表示されます。

django host not allowed

DjangoのALLOWED_HOSTSを設定する

まず、開きっぱなしのCloud9のIDEで、MyTestAppディレクトリにあるmanage.pyを開きます。
その中ほどまでスクロールし、ALLOWED_HOSTSというリストに、先程の「パブリック DNS (IPv4)」の欄に表示されている内容を追加します。
もう一度、:8000で終わるURLにアクセスして下さい。

下のように、Djangoの初期画面が表示されれば成功です。
django default page

まだ、EC2やSecurityGroupとの連携がないせいで、結構めんどくさいですね。(2017年12月3日時点)
しかし、そのうち解消されるような気もします。

AWS Cloud9でPython開発する準備 | Django 入門

Python独学ならTech-Joho TOP > django入門 > AWS Cloud9でDjango起動

cloud9トップ

AWS Cloud9とは

Cloud9は、ブラウザ上で利用可能なIDE(Integrated Development Environment、統合開発環境)です。
JavaScriptやPython等、様々なプログラミング言語のプログラミング、実行、デバッグができます。

もともとは独立した会社が運営していましたが、2017年初頭にAmazonに買収されたようです。

Cloud9
https://aws.amazon.com/jp/cloud9/

Cloud9の公式ドキュメント
https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html

Djangoの開発環境としてのCloud9

このサイトでは、WindowsでのDjango開発方法について公開しています。

Django入門

しかし、実は、Djangoの開発をWindowsですることは、余りおすすめできません。

Djangoを使って開発したアプリを公開する時に、実際に配置するサーバがWindowsであることがほとんどないからです。
大抵はLinuxのUbuntuかCentOSになります。

そして、開発環境と公開するための本番環境はなるべく同じにするべきです。
開発環境でせっかくつくったものが、本番環境ではうごかないことを防ぐためです。
(ちなみに、OSだけでなく、Pythonやライブラリのバージョンなど、開発環境と本番環境で揃えるべきポイントは他にもたくさんあります)

しかし、いろいろな事情でWindows環境で開発しなくてはならない場合もあると思います。
その時、ブラウザ上で動くCloud9なら、ブラウザを動かすOS自体はWindowsでもMacでもなんでも構いません。
また、実際に開発中のアプリが動くのは、EC2上のAmazonLinuxなので、そのままEC2を本番環境にも使用すれば問題は少なくなります。
もちろん、AmazonLinx以外にも利用できます。

そこで、Cloud9を使ってDjangoのアプリケーションを開発してみましょう。

Cloud9をはじめてみる

まず、AWSのアカウントを持っていない人は、アカウントを作りましょう。
注意点としては、必ずクレジットカードが必要です。
Cloud9によるdjango開発の過程で、EC2の環境へのデプロイを選択した場合には、EC2のインスタンスの利用料金がかかります。

デプロイの説明はこちら
EC2の説明はこちら

しかし、AWSはアカウントを作ってから1年間は無料枠というものがあり、ある程度は無料で利用できます。(2017年12月3日現在)

アカウントを作成したら、ログインしましょう。

https://aws.amazon.com/jp/cloud9/

上記のリンク先にアクセスし、右上の”Sign in to the Console”をクリックして下さい。(なお、2017年12月現在、Cloud9は英語版のみのようです。)

cloud9トップ

先程作成したアカウントを入力し、サインインしてください。

サインインしたら、左上の「サービス」をクリックし、開いたメニューの「Cloud9」をクリックします。

aws

Cloud9のトップ画面に戻るので、”Create Environment”をクリックします。

create env

下のような画面が表示されます。

上部に表示されているアラートは、この環境専用のIAMアカウントを作れ、と言っていますが、
このアカウントで本番環境用のアプリを開発する予定がなけらばこのままでも良いでしょう。
xボタンを押して消しましょう。

new env

この画面では、環境の名前(Name)を入力する必要があります。
下の例では、説明(Description)も入力しています。
入力し終わったら、”Next Step”をクリックしてください。

env input

次に、Cloud9で開発する環境をどこに作るか選びます。
分かりやすいのは、初期選択の”Create a new instance for environment”です。
EC2インスタンスを新しく立ち上げます。
既存のEC2インスタンスを利用する場合はもう一つの選択肢を選びましょう。

Environment type

EC2インスタンスのタイプを選びましょう。
これは仮想マシンの性能を選んでいます。
これも、開発段階なら初期選択の一番低いt2.microで十分です。
最後にまた”Next Step”をクリックします。

select-instance-type

確認画面が表示されるので、これでよければ、一番下の”Create Environment”をクリックして下さい。

create env2

くるくるまわるインジゲータが表示され、2、3分待つと、環境が作成され、この環境専用のEC2インスタンスも作成されています。

Cloud9のIDE

IDEがやっと表示されました。
この画面下部は、作成したEC2インスタンスにsshログインした状態のコンソールです。
左にファイルの一覧があります。
上部にはいろいろなメニューが並んでいますが、とりあえず大事なのは”Run”ボタンくらいです。

まずは、IDEの使い方になれるために、簡単なプログラムを実行してみましょう。
真ん中にある”Create File”をクリックしてましょう。
welcome to ide

ファイルを編集するタブが開きます。タブ名は”Untitled”になっています。

まず、Pythonの簡単なFor文を書いてみます。
(ちなみに、下のコンソールでは試しにlsコマンドやvimの起動をしてみました。気になる人は試してみて下さい。)

この状態で、一旦保存しましょう。Ctrl+Sを押して下さい。
forjs

このような、保存先、保存名などをきめるダイアログが開きます。適当に入力して”Save”をクリックしましょう。
save as dialog

ファイルのタブにファイル名が付きました。

次に、プログラムを実行してみましょう。
上の”Run”ボタンをクリックしましょう。
saved and run

下のコンソールに実行結果が表示されました。
run result

ちなみに、ファイルの編集タブの左の数字の左をクリックすると、プログラムの実行を停止するためのBreakpointを設定できます。Breakpointを設定した状態でRunすると、その箇所でプログラムを停止できます。(そのはずですが、2017年12月3日現在、うまくうごきませんでした… 早く解消されることを望みます)

breakpoints

一応Pythonプログラムを作成して実行できたので、次はDjangoアプリを作ってみましょう。

Djangoアプリの起動

記事が長くなったので、Djangoアプリの作成と起動は別記事にわけたいと思います。こちらをごらんください。
AWS Cloud9でDjangoアプリを作成| Django 入門

Windows 10 condaによる環境構築からdjangoのインストール | Django 入門

Python独学ならTech-Joho TOP > django入門 > Windows 10 condaによる環境構築からdjangoのインストール

condaによるdjnagoのインストール

以前、こちらのページでvirtualenvによるdjangoのインストールから起動までの記事を公開しました。

virtualenvでWindows10 に Django インストール

しかし、condaのほうがいろいろと楽そうだったので、miniconda版のインストール手順を公開します。

minicondaのインストール

まず、minicondaをインストールします。
minicondaはpythonのデータ分析用のいろいろ便利なパッケージが入ったanadondaの最小構成版といったような存在で、djangoの開発環境としてはちょうどいいと思います。
くわしくは、下の記事をご覧ください。

Pythonのインストール方法の選択肢

minicondaは下記の公式ページからインストーラをダウンロードし、実行、次々とボタンを押していけばすぐに完了です。

minicondaダウンロードページ
https://conda.io/miniconda.html

ほとんどのばあい、64ビット版で問題ないと思います。

「64-bit (exe installer)」をクリックしてダウンロードしてください。

condaの仮想環境作成

こちらのページに全部書いてあるので実行してください..
Pythonのインストール方法の選択肢

一応、こちらには最小限の手順だけ書いておくことにします。

下の<仮想環境の名前>というところには好きな英数字の名前を入れてください。”djangoproj1″とか、”myapp”とか何でもいいです。

  1. インストールされた、Anaconda prompotを起動する
  2. Anaconda prompotで ”conda create -n <仮想環境の名前>”を実行し、仮想環境を作る
  3. Anaconda prompot で “activate <仮想環境の名前>”を実行し、仮想環境を有効化する
  4. いろいろ作業する

一応、ここでは”djangoapp1″にしたことにして説明を続けます。。

> conda create -n djangoapp1

途中で”Proceed ([y]/n)? y”と聞かれるのでy、エンターを押します。

condaによるdjangoのインストール

Anaconda promptを起動し、djangoアプリを作る仮想環境を有効化します。
ここでは、上記で作成したdjangoapp1を有効化します。

> activate djangapp1

有効化されると、下のように、プロンプトの左側に仮想環境名が表示されます

(djangoapp1) >

この状態で、下のコマンドを実行して、djangoをインストールしましょう

(djangoapp1) > conda install django

途中で”Proceed ([y]/n)? y”と聞かれるのでy、エンターを押します。

こんな風に、condaコマンドはpipの代わりのように使えます。

djangoのプロジェクト作成

まず、cdコマンドでプロジェクトを作りたいフォルダまで移動します。
ここでは、ユーザのHOMEPATHの下にprojectsフォルダを作りそこに移動します。

(djangoapp1) > mkdir projects
(djangoapp1) > cd projects

プロジェクトを作るには、以下のコマンドを実行します。

(djangoapp1) >django-admin startproject <プロジェクトの名前>

先ほどと同じように、<プロジェクトの名前>は自由です。

ここでは、djangoproject1という名前にすることにして進めます。

(djangoapp1) >django-admin startproject djangoproject1

これで、自動的にプロジェクト名を同じ名前のフォルダが作成され、中にdjangoのプロジェクトに必要なファイルが自動でコピーされました。

プロジェクトのフォルダに移動し、djangoのアプリサーバを起動してみましょう。

(djangoapp1) > cd djangoproject1
(djangoapp1) > python manage.py runserver

anaconda prompotは大体このようになっているはずです。
仮想環境の有効化からdjango立ち上げまで

最後に、http://localhost:8000/にブラウザでアクセスして、djangoアプリの起動を確認しましょう。
このように表示されていれば成功です。

django it works
ただし、このままではプロジェクトは空っぽですので、これから内容を開発していく必要があります。

これからの手順についてはこちらをご覧ください。

Django入門の一覧ページへ

Pythonのインストール方法の選択肢 | Django 入門

Python独学ならTech-Joho TOP > django入門 > Pythonのインストール方法の選択肢

どれを選べばいいか

Windows10でDjangoの開発をするにあたって、そもそもPythonをインストールする方法が複数あります。
どれを選べばいいか、一つ一つメリット・デメリットを考えてみます。

主な方法は3つあります。

  1. 公式のWindows版インストーラを使う方法
  2. Pythonに最初から入っている仮想環境ツールvenvを使う方法
  3. 仮想環境ツール&パッケージマネージャーのanacondaを使う方法

結論から言うと、anacondaを使うのが特に初心者には無難な気がします。
(が全く面倒がないわけではありません…)

参考
データサイエンティストを目指す人のpython環境構築 2016

https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

Windows版インストーラ

Windows版インストーラのダウンロード

インストーラは下のリンク先からダウンロードできます。

python.org(Pythonの公式ページ)
https://www.python.org/downloads/
「Download Python 3.6.3」をクリックして下さい。

download

Windows版インストーラによるインストール

インストーラをダブルクリックして起動後、「Install Now」をクリックしてください。

install

ウインドウの下にある「Add Python 3.6 to PATH」というチェックボックスは、Pythonの実行ファイルまでのPathを環境変数に追加するか否かを選択するものです。
ここで、ほかにPythonを使う予定がある場合、追加してしまうと、今インストールしているPythonが優先になってしまいます。どうすべきかは状況によります。
このような判断も、仮想環境を使うと必要がなくなるので、インストーラを使う方法は実はおすすめでははありません。

この記事ではチェックを入れないで進むことにします。

また、この手順でインストールされるのは、Pythonの32ビット版です。

「Setup was successful」という画面が表示されたら正常にインストールが完了しています。

Windows版インストーラでインストールしたPythonを使う方法

スタートメニューに「IDLE(Python 3.6 32-bit)」が追加されているはずです。
startmenu

こちらをクリックすると、Pythonと同時にインストールされた簡易的な統合開発環境IDLEが起動します。

こちらには、Pythonを対話的に実行できる、つまりコードを入力してすぐ結果を見ることのできる環境Python 3.6.2 Shellと、ファイルにPythonコードを書いて実行できる機能が含まれています。

Shellrepl

ファイル編集file

Pythonの学習時などに、ちょっと実行してみたいときはShellを、プログラムを開発するときにはファイルの編集機能を使いましょう。

IDLEのファイルの編集画面では、「F5」キーを押すことですぐに実行できて便利です。

プログラムを実行した結果は、このようにShellに表示されます。


file2

*また、もし、インストール時に「Add Python 3.6 to PATH」にチェックを入れていた場合、PowerShellを起動してPythonと入力し、エンターキーを押すとインストールしたPythonが実行されます。

Windows版インストーラで入れたPythonのメリットとデメリット

メリットとして考えられるのはインストールが簡単なことです。
デメリットは複数のPythonをインストールしなければならない状況に対応しずらいことです。
PythonやDjango本体を含めたPythonのパッケージは、日々更新されていきますが、それぞれが特定のバージョンに依存しています。
あるアプリを開発した古いPythonの環境を残したまま、別のアプリを新しい環境で構築したい、ということはよくありますが、この方法だけでは対応できません。
また、既にシステムに古いPythonが入っていて、それに依存するソフトウェアがある場合、そのソフトウェアが動かなくなるなどの問題が発生する可能性もあります。
デメリットが大きいので、このPythonをそのまま使用するのは基本的におすすめの方法ではありません。

 

venv

venvはPython3.6に付属の仮想環境管理ツールです。
異なるパッケージのインストールされた仮想環境を複数作ることができます。

venvによる仮想環境の作成方法

Windows PowerShellを開いて、下記を実行します。

> python3 -m venv <仮想環境のパス>

簡単です。
一つ注意点は、venvを利用するには、上記の公式のインストーラでPythonをインストールしておかないといけないということです。
また、異なるバージョンのPythonを利用する方法は私はわかりませんでした…
(virtualenvという非常に普及している別のツールならできます)

参考
28.3. venv — 仮想環境の作成(Pythonの公式ドキュメント)
https://docs.python.jp/3/library/venv.html

venvで作った仮想環境の利用方法

まず、仮想環境をactivate(有効化)します。

> <仮想環境のパス>/bin/activate

この環境でインストールしたパッケージ等は、外の世界のPythonに影響を与えません。

仮想環境から出るにはdeactivateです。

deactivate

実行してみた例です。

 

pwshel

venvメリットとデメリット

venvによって作った仮想環境のPythonを利用するメリットは、インストールしたパッケージが、外の世界のPythonに影響を与えないことです。
開発するアプリケーションごとに仮想環境を作れば、お互いに影響を与えずに開発を進めることができます。
あるアプリで、あるパッケージのバージョンを上げたことで別のアプリが動かなくなる、という事態を防ぐことができます。

デメリットは、最初のPythonは、インストーラで導入する必要がある点です。

Anaconda

AnacondaはPython開発環境が簡単を作ることのできる便利ツール、と私は理解しています。
公式ページのWhat is Anaconda?では、「世界で一番人気のデータサイエンスの基盤」と書いてあるように、Anacondaには、データ解析に便利なツールがたくさん含まれています。
例えばPythonコードを埋め込めるノートアプリJupyter Notebookなどです。

Anaconda公式ページ
https://www.anaconda.com/

ただ、Anacondaはそれ以外にもいろいろな機能があり、仮想環境をつくることもできます。
また、pipの代わりになるパッケージマネージャとしての機能もあります。(pipを併用することも可能)

ただし、いろいろなパッケージを含んでいてとても容量が大きく、インストールも大変で、Djangoの開発環境として要らない機能も多いので、
私は最小構成版のminiconaをおすすめします。

minicondaのダウンロード

minicondaダウンロードページ
https://conda.io/miniconda.html

上記のページからインストーラをダウンロードしましょう。「64-bit (exe installer)」をクリックしてください。

miniconda

minidondaのインストール

ダウンロードしたインストーラをダブルクリックして起動し、基本的に「next」等を押していけば完了します。

miniconda

minidondaの使い方

インストールが完了したら、スタートメニューに「Anaconda Prompt」が追加されているはずです。

anconda prompot in start menu

クリックして起動しましょう。
基本的にこのAnaconda promptを使ってPythonを実行しましょう。

ここでのPythonの使い方は、venvと似ています。

Anacondaの仮想環境の作成方法

Anaconda promptで、仮想環境をつくりましょう

> conda create -n <仮想環境の名前>

途中で、「Proceed ([y]/n)?」と聞かれるので、yを押しましょう。
簡単です。

Anacondaの仮想環境の利用方法

Anaconda promptで、以下を実行すると、仮想環境に入ることができます。

> activate <仮想環境の名前>

仮想環境からでるにはdeactivateです。

> dactivate 

一通り実行してみました。anacondashell

Anacondaのメリットとデメリット

Anacondaのメリットは、venvのメリットがすべてに加えて、最初にPythonをインストールしなくてもよいところです!
あと、仮想環境ではpython自体のバージョンも変えることができます。
デメリットとしては、Djangoアプリケーション開発環境としてはいらないもの(Jupyter notebookなど)が入ってしまう点でしょうか。
ただ、全体としてはAnacondaが一番すっきりした環境だと感じます。

結論

というわけで、3つの環境を見た結果、Anaconda promptが一番のような気がします。

Django 1.11 モデルの追加とマイグレーション | Django 入門

Python独学ならTech-Joho TOP > django入門/ > Django 1.11 モデルの追加とマイグレーション

Djangoでモデルを追加する

 

こちらのDjango公式チュートリアル (バージョン1.11用)をやってみます。

https://docs.djangoproject.com/ja/1.11/intro/tutorial02/

そのままやっても意味がないので、モデル名を変えてみます。

初心者の方は、両方を見比べることで、どのようにモデルを作ればいいのかがわかると思います。

基本的に、こちらの記事の続きです。

Windows 10 でDjango入門

設定

アプリ名は

“djangoTestApp”

だとします。

データベース名は

“django_test_app”

です。

データベース設定

mysqlにログインして

CREATE DATABASE django_test_app;

djangoTestApp2/settings.py

DATABASES = {
  'default': {
    #'ENGINE': 'django.db.backends.sqlite3',# もともとの設定
    'ENGINE': 'django.db.backends.mysql',
    #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # もともとの設定
    'NAME': 'django_test_app',
    'USER': 'xxxx',
    'PASSWORD': 'xxxx',
    'HOST': '127.0.0.1'
  }
}

上記のような書き方は、settings.pyの一部を表す。
例えば、上の例は76行目付近だった。
settings.pyを開いて、DATABASES等で検索して該当箇所まで移動して修正すること。

もしくは、設定ファイルを別に用意して使う
参考

https://docs.djangoproject.com/ja/1.11/ref/databases/#mysql-notes

djangoで使えるmysqlのアダプタはいくつかある

python3で推奨されているmysqlclient にする
参考

コンソール

> pip3 install mysqlclient

コンソールというのは、windows power shellや、コマンドプロンプトのこと
>の行の内容を入力する

ついでに、タイムゾーンと言語設定

djangoTestApp/settings.py

#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja-jp'
#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'

タイムゾーンのリスト
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

マイグレーション実行の方法

コンソール

> python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

こんな感じの表示が出たら成功

 

モデル作成

もともとのチュートリアルは投票アプリケーションらしく、
Question(投票項目)とChoice(選択肢)という2つのモデルを定義する

同じ例ではつまらないので、はてなブックマークのようなソーシャルブックマークサービスを想定する
Article(記事)とBookmark(ブックマーク)
ブックマークにはstar(スター)をつける

アプリ作成からやりなおす

>  python manage.py startapp bookmaker

bookmaker/urls.py
をつくり
djangoTestApp/urls.pyを修正する

仮のER図はこちらです。
ER図(articleとbookmark)

djangoのDB変更は3ステップ

  • models.pyを変更
  • python manage.py makemigrations でマイグレーションファイルを作成
  • python manage.py migrate でマイグレーション実行

djangoTestApp/models.py

rom django.db import models


class Article(models.Model):
"""記事"""
summary = models.CharField(max_length=200)
published = models.DateTimeField('date published')


class Bookmark(models.Model):
"""ブックマーク"""
article = models.ForeignKey(Article, on_delete=models.CASCADE)
comment = models.CharField(max_length=200)
stars = models.IntegerField(default=0)

djangoTestApp/settings.py

INSTALLED_APPS = [
  'bookmarker.apps.BookmarkerConfig',
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

モデルを確認して、マイグレーションファイルを作成する

> python manage.py makemigrations bookmarker
Migrations for 'bookmarker':
  bookmarker\migrations\0001_initial.py
    - Create model Article
    - Create model Bookmark

0001というマイグレーションができた

できたマイグレーションの内容を確認

> python manage.py sqlmigrate bookmarker 0001
BEGIN;
--
-- Create model Article
--
CREATE TABLE `bookmarker_article` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `summary` varchar(200) NOT NULL, `published` datetime(6) NOT NULL);
--
-- Create model Bookmark
--
CREATE TABLE `bookmarker_bookmark` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `comment` varchar(200) NOT NULL, `stars` integer NOT NULL, `article_id` integer NOT NULL);
ALTER TABLE `bookmarker_bookmark` ADD CONSTRAINT `bookmarker_bookmark_article_id_8c3fd859_fk_bookmarker_article_id` FOREIGN KEY (`article_id`) REFERENCES `bookmarker_article` (`id`);
COMMIT;

CREATE TABLEのSQL文がふたつ

> python manage.py migrate

実行された

 

Shellでモデルの使い方の確認

シェル起動

> python manage.py shell

いろいろなメソッドを使ってみる

>>> from bookmarker.models import  Article
>>> Article.objects.all()

>>>
>>> from django.utils import timezone
>>> a = Article(summary='This is the first article.', published=timezone.now())
>>> a.save()
>>> a.id
1
>>> a.summary
'This is the first article.'
>>> a.published
datetime.datetime(2017, 10, 11, 4, 11, 25, 212888, tzinfo=)
>>> Article.objects.all()
]>

モデル一覧を見てみたが、(Article.objects.all())中身がぜんぜんわからないので、表示設定をする

 

モデルに表示設定など追加
models.py

import datetime
from django.db import models
from django.utils import timezone

class Article(models.Model):
  """記事"""
  summary = models.CharField(max_length=200)
  published = models.DateTimeField('date published')

  def __str__(self):
    return self.summary

  def was_published_recently(self):
    return self.published >= timezone.now() - datetime.timedelta(days=1)

  class Bookmark(models.Model):
  """ブックマーク"""
  article = models.ForeignKey(Article, on_delete=models.CASCADE)
  comment = models.CharField(max_length=200)
  stars = models.IntegerField(default=0)

  def __str__(self):
    return self.comment

__str__というメソッドをそれぞれ追加した。

もう一回シェルを立ち上げて確認する

> python manage.py shell

モデルのいろいろな使い方を確認してみる
検索、取得、作成、削除など..

>>> from bookmarker.models import  Article
>>> Article.objects.all()
]>
>>> Article.objects.filter(id=1)
]>
>>> Article.objects.filter(summary__startswith='This')
]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Article.objects.get(published__year=current_year)

>>> Article.objects.filter(id=2)

>>> Article.objects.get(id=2)
Traceback (most recent call last):
  File "", line 1, in 
 略
    self.model._meta.object_name
bookmarker.models.DoesNotExist: Article matching query does not exist.

>>> a1 = Article.objects.get(pk=1)
>>> a1.was_published_recently()
True
>>> a1.bookmark_set.all()

>>> a1.bookmark_set.create(comment='good!', stars=0)

>>> a1.bookmark_set.create(comment='bad', stars=10)

>>> b3 = a1.bookmark_set.create(comment='???', stars=2)
>>> b3.comment
'???'

>>> Bookmark.objects.filter(article__published__year=current_year)
, , ]>

>>> b3.delete()
(1, {'bookmarker.Bookmark': 1})
>>> Bookmark.objects.filter(article__published__year=current_year)
, ]>

 

管理画面

管理ユーザ作成

> python manage.py createsuperuser
Username (leave blank to use 'xxxx'): admin
Email address: admin@example.com
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
Password:
Password (again):
Superuser created successfully.

最初passにしようとしたらtoo short too commonと怒られた。
passpassにしたら通った。これでいいのか?

アプリ起動

> python manage.py runserver

http://localhost:8000/admin
にアクセス
Django管理サイトのログイン画面

ログイン後
Django管理サイトログイン後

追加したモデルを管理対象にする

bookmaker/admin.py

from django.contrib import admin

# Register your models here.
from .models import Article, Bookmark

admin.site.register(Article)
admin.site.register(Bookmark)

もう一回アクセス
管理対象のモデル一覧

Articlesをクリック
Article一覧

This is the first article.をクリック

Article管理

ちゃんとタイムゾーンで指定した通り、日本時間で表示されている

MySQLのDB内を直接のぞくと、UTCになっている

DBの中身

ちなみに、MySQL Workbenchを使っている
https://www.mysql.com/jp/products/workbench/

20日に変更して保存
Article20日に日付変更

これでチュートリアル2は終わり

 

おまけ: Herokumへのデプロイ

デプロイの手順の記事

Django 1.11 Herokuでデプロイ

Python独学ならTech-Joho TOP > django入門/ > Django 1.11 Herokuでデプロイ

Herokuは無料枠もあるPaasです。
Djangoで作ったWebアプリケーションを無料で公開できます。

Ruby on Railsではよく使っていましたが、Djangoは初めてだったので試してみました。

参考
https://qiita.com/Shitimi_613/items/6627d0ce042d38b86893

アプリはこちらのやつ
Django 1.11 モデルの追加とマイグレーション

windows上で開発しているので、関連箇所あり。

> pip install django-toolbelt

Procfileを作成

web: gunicorn djangoTestApp2.wsgi --log-file -

runtime.txtを作成

python-3.6.2

requirements.txtを作成

pip freeze > requirements.txt

この後、pywin23の行を削除する
そのほか、pipにいらないパッケージがあった場合も削除
いるものだけ書けばよい

settings.py に追記

STATICFILES_DIRS = (
  os.path.join(BASE_DIR, 'static'),
)
# DATABASES~の下あたりに追記
import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=400)
DATABASES['default'].update(db_from_env)

djangoTestApp/wsgi.pyを変更

import os

from dj_static import Cling # これ追記
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoTestApp.settings")

application = Cling(get_wsgi_application()) # ここ変更

Herokuのツールのインストール
https://devcenter.heroku.com/articles/heroku-cli

herokuでログイン

> heroku login
Enter your Heroku credentials:
Email: xxxx@xxxxx.net
Password: ************
Logged in as xxxx@xxxx.net

herokuのプロジェクト作成

> heroku create
Creating app... done, xxxx-xxxx-xxxx
https://xxxx-xxxx-xxxx.herokuapp.com/ | https://git.heroku.com/xxxx-xxxx-xxxx.git

注意!! 以下のようにすれば後々のビルドパックの指定がいらなかった

> heroku create --buildpack heroku/python

ここででてきたアプリのホストを、settings.pyに追加

ALLOWED_HOSTS = [
    'xxxx-xxxx-xxxx.herokuapp.com'
]

よくわからない設定(静的ファイル関係だと思うけど)

heroku config:set DISABLE_COLLECTSTATIC=1

デプロイ

git push heroku master

エラー出た

> git push heroku master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (19/19), 4.91 KiB | 1005.00 KiB/s, done.
Total 19 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote:  !     No default language could be detected for this app.
remote:                         HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote:                         See https://devcenter.heroku.com/articles/buildpacks
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !       Push rejected to salty-river-85500.
remote:
To https://git.heroku.com/xxxx-xxxx-xxxx.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/xxxx-xxxx-xxxx.git';


webのほうで、Pythonのビルドパックを追加した

Herokuのアプリ管理

ビルドパック追加

再度

git push heroku master

マイグレーション

> heroku run python manage.py migrate


アプリを開く

> heroku open


virtualenvでWindows10 に Django インストール | Django 入門

Python独学ならTech-Joho TOP > django入門/ > Windows 10 でDjango入門

Django

Djangoは、PythonのWebアプリケーションフレームワークです。

http://djangoproject.jp/

RubyのRuby on Railsくらい有名で、昔からあります。

最近いじってなかったのと、windows環境での開発は初めてなので、
開発環境を作ったメモを公開します。

このページはPython初心者の方には難しいです。まず入門編をご覧ください。
Python Hello World
続きもあります

環境

以下は導入済み

  • Windows 10 Creaters Update
  • Python 3.6.2 (x64)
  • MySQL5.7

現時点での最新版を入れると、Django 1.11.5 がはいりました。

参考

公式インストールガイド

virtualenvいれる

virtualenvは、Python用の仮想環境で、例えば環境ごとにpipでいれるモジュールをわけられます。

Rubyのrbenvみたいな感じです。

参考

windowsパワーシェルを起動し、ホームディレクトリで下記を実行

python get-pip.py
pip install virtualenv
mkdir .virtualenvs
virtualenv .virtualenvs/djangodev

pipをインストールし、virtualenv用のディレクトリ.virtualenvを作って、そこにdjangodevという名の仮想環境をインストールしています。

無事インストールできたら、下記のスクリプトを仮想環境djangodevを有効化できます。

.\/.virtualenvs/djangodev/Scripts/activate

私の環境では、パワーシェル用のスクリプトは実行デキない設定になっていました。
上のスクリプトを実行するにはポリシー変更が必要でした。

参考
http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html
管理者権限でパワーシェルを起動し、下のコマンド実行でポリシーを変更できました。

Set-ExecutionPolicy RemoteSigned

仮想環境が有効化されたら、パワーシェルのプロンプトの左側に下のように表示されます。

(djangodev) xxx 

Djangoのインストール

仮想環境の中で、Djangoをインストールします。
pip install Django
python -m django –version

1.11.5が入ったことが確認できます。

Django起動

せっかくなのでチュートリアルのアプリを作って起動するところまでやってみます。

参考
https://docs.djangoproject.com/ja/1.11/intro/tutorial01/

cdコマンドでDjangoのプロジェクトを作りたいところまで移動して

django-admin startproject mysite

これでmysiteプロジェクトができます。

mysiteプロジェクトのディレクトリ内に移動します。

cd mysite

manage.pyはいろいろやってくれるpythonのスクリプトです。開発用のサーバを立ち上げましょう。

python manage.py runserver

これで起動するはずです。

ブラウザでhttp://127.0.0.1:8000/にアクセス。

Djangoの動作を確認できる初期画面

画面が確認できたら成功です。


おまけ iintellij ideaで既存のvirtualenvを読み込む方法

私はintellij ideaにpythonプラグインを入れたものをメインのエディタにしています。

iintellij ideaで既存のvirtualenvを読み込む方法は以下のサイトにのってました。

file>project structure  から
https://stackoverflow.com/questions/20877106/using-intellijidea-within-an-existing-virtualenv

つづき

モデルの追加とマイグレーション | Windows10でDjango入門2

Django をHerokuにデプロイ