[後編] 文系初学者がPython×Flask×データベースをつかって検温記録WEBアプリをつくってみたメモ

この記事は、忘れっぽい自分のための覚え書きメインですが、初学者/文系/非エンジニア/趣味レベルの同胞にも参考になればと、丁寧めに書き留めていきます。

特に初学者は汎用的な情報から察したり応用する力が弱いので、あえて写実的な書きっぷりにしています。結果、鬼のように長くなったので前・後編に分けました。（それでも長いですが）

ちなみにこの時からアップデートを重ねて、いまではLINEでサクッと記録できるようになりました。一般公開してますので、よろしければお試しください。
[LINE公式アカウント「毎日検温くんβ」](https://lin.ee/CGECIiB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/0f1db993-312d-87e6-3891-67258696aa5f.png)

#振り返り
[前編はコチラ](https://qiita.com/kazuyamano/items/84542f7b03176370db14)

前編はローカル環境（=PC端末内）でちゃんと動くWEBアプリまで育ちました。
後編はいよいよ、インターネッツの大海原へと漕ぎ出します。
前述のとおり、Herokuを使ってインターネット公開を目指します。

サラッと涼しい顔で書きましたが最初は「ヘロクって何？強めの武器？」という状態でした。
まぁ何とかなるもんですね。

#9．Githubにリモートリポジトリをつくる
ローカル環境から飛び出す一歩目です。
リポジトリって何やねんですが、ファイルの保管庫のことですね。

>・いまVSCodeで編集しているPC内の保管庫（[ken-on-kun]フォルダ）が`ローカルリポジトリ`
・WEB公開するためにインターネット上に置くファイル保管庫が`リモートリポジトリ`

後者を、Github上につくります。
（アカウント登録の手順はこの記事では割愛します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/a80cc7d1-ce92-bfa3-a41b-eec6c3622c2c.png)
GitHubにログインして、右上の「+」から「New repository」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/6ef72f4f-3273-c13d-cbf1-1b23b7b7ae89.png)

 1. `Repository name`を決める （なんでもいいですが、ローカルと同じ名前がいいんですかね）
 1. `Initialize ~`にチェック入れる
 1. `Create repository`する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/bcd64e4e-a6a9-0bd2-b066-cb9bea252270.png)
はい、できました。

この時点では保管庫をつくっただけなので、空き箱状態です。
（正確には、`README.md`っていう紹介用のファイルだけが自動生成されてます）


#10．ローカル ⇄ リモートリポジトリを連携
ローカルの[ken-on-kun]フォルダの中身を、リモート（Github上）の[ken-on-kun]フォルダにアップして、同期状態にすることが次のステップです。ここで「Git」を使っていきます。

同期したあとの変更履歴を管理する仕組みが「Git」で、それを応用してWEBブラウザでわかりやすく多機能にしてるのが「Github」、という感じで解釈してます。

###リモート先Gitを設定する
Githubサイトの`Clone or download`をクリック →表示されたURLをコピー
これが、`リモートリポジトリのURL`です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/b18379ae-da2d-cf9e-5d1e-675744ba1b3c.png)

次にターミナルで、下記を１行ずつ実行します。

```
% git remote add origin <リモートリポジトリのURL>
% git config --global user.name "GitHubに登録しているユーザー名"
% git config --global user.email GitHubに登録しているメールアドレス
```
ちゃんと入ったかどうかは、下記で確認できます。

```
% git remote -v
% git config user.name
% git config user.email
```
実際の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/a01375a1-1518-c921-ebb4-1f02537976c0.png)
黒塗りのところに、ご自身のGitHub登録情報が返ってきたら成功です。

###リモート先からローカルにフェッチする
リモート(GitHub側)の最新情報を、ローカル(PC側)に落とし方向に同期することを「フェッチ」というそうです。聞き慣れない用語が増えてきましたが、まぁそのうち慣れるやろ、くらいのノリでいきます。

ターミナルで下記を実行

```
% git fetch
```
実際の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/1d9cf0c9-7147-d178-0452-146209001f76.png)
何やらwarningが出ていますが気にしなくていいようです。
最後の１行が出てればOK。
ローカルのmasterブランチが、リモートのorigin/masterブランチの最新情報を見にいきましたよ、みたいな感じですかね。知らんけど。

「フェッチ」とか「プル」とか「ブランチ」とか、Gitの仕組みについては以下がわかりやすかったです。
[サル先生のGit入門サル先生のGit入門〜バージョン管理を使いこなそう〜【プロジェクト管理ツールBacklog】](https://backlog.com/ja/git-tutorial/)
[git fetchの理解からgit mergeとpullの役割 - Qiita](https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921%E3%80%80)
　

#11．ローカル ⇄ リモートリポジトリを同期
ここまでGit設定ができると、GithubとVSCodeをいつでも連携できる状態になってます。
ローカル(PC側)でファイルを編集して、変更点をリモート(GitHub側)に反映、という一連の作業がすべてVSCode上でできます。ターミナル操作とかGitの理解がイマイチな状態でも、とりあえずサクサク進められるのでめっちゃ助かります。

なおこのローカル→リモートへの上げ方向の同期を「プッシュ」と呼びます。さきほどの「フェッチ/プル」とは逆方向ですね。

###VSCodeで変更履歴を「コミット」
またもや新キャラ「コミットさん」登場。
専門用語攻勢が息つく間もないですが、立ち止まらず走りましょう。
ローカルでファイル編集したら、「コミット」して、「プッシュ」する。がGitのお作法ということで。考えず感じましょう。

VSCode左メニューの枝分かれ的なアイコンをクリック　（`Souce Control`というメニュー）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/d8808840-1c7a-eab8-51c7-838e752f78a5.png)
入力欄に、何がしか変更履歴を表すコメントを入力して、`Command+Enter`
（もしくは入力欄上のチェックマーク形のアイコンをクリック）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/9ae293e1-364e-80bf-0521-d3fa86c7640c.png)
この行為が「コミット」です。
リモートリポジトリ（=Github）にプッシュする準備として、ローカル内の発射台に乗せる感じですかね。
コメントを入力するのは、発射ごとの変更内容が後からわかりやすいように、という目的。

ちなみにコメント欄の下`CHANGES`に並んでいるファイルが、このコミットでの変更点一覧で、`Command+Enter`でコミットが完了するとリセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/b14ce77f-3dbe-5dab-c115-12c80c6a4ae6.png)
上部にある道路標識みたいなアイコンを押すと、過去のコミット履歴を見れます。
一回履歴があるので、どうやらFirst commitではなかったようです。（という記憶喪失も可視化してくれます）

###コミットしたら、リモートに「プッシュ」
どんどん荒っぽく進めます。
左下の「雲にGo！」的なアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/62cb1d25-faa1-0ad3-0766-9b988a2ced21.png)
すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/fc181c1b-4539-6acd-4e82-7e0c9d7b9db3.png)
Oh...　あきまへんがな...

`Open Git Log`を押してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/19b5a121-e23c-5eea-1713-0ead50959282.png)
すると、右下の`OUTPUT`ってところに該当のエラーログが表示されます。
VSCodeすご。

さきほどのウォーニングとログの`hint`から察するに 「Pushの前にまずPullしなはれ！」 ということかな。。。
自信ないけどやってみる。

###ターミナルで、リモートからGit「プル」
「プルせい！」と言われたものの、前の工程で「フェッチ」までいってしまってるので、ここでは「マージ」をします。
ってわけわかんないですよね、以下が方程式だそうです。
>プル　＝　フェッチ　＋　マージ

[git fetchの理解からgit mergeとpullの役割 - Qiita](https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)

むずい。でもやるしかない。ターミナルで以下実行します。

```
git merge origin/master
```
そしてもう一回、VSCodeで「雲へGo」をクリック。
すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/253d61d3-b9dd-9931-85c9-7dbf0531c81f.png)
お、今度はうまくいったんでは？

リモートリポジトリ側、Githubでチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/b0aaabd2-1982-ce50-1cd5-2030546c1991.png)
もとあったREADME.mdのほかに、前編でつくったファイルが追加されました。
ないす。

ローカルリポジトリ側も見てみます。
VSCodeの左メニュー、ファイルっぽいアイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/f6f5174a-6ffe-5983-c2ac-73d21746aa9d.png)
`EXPLORER`を見ると、`KEN-ON-KUN`の中にさっきまでなかった`README.md`が追加されたことがわかります。（Github上にリモートリポジトリを作った時、自動生成されたやつ）

上げ方向も下げ方向も、ちゃんと同期できたようです。
う、うれしい...



#12．Heroku連携前の下準備
ここのパートは、ひとつひとつ理解するのは難解だったので（自分でもうまく説明できない）、淡々と作業を羅列します。ただ、どれもこれもその後エラーを起こさないための重要な工程なので、モレなく確実にやっておきましょう。

###ターミナルでgunicornとpsycopg2をインストール
１行ずつ実行します。

```
% pip install gunicorn
% pip install psycopg2
```
実際の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/0a7fe54d-ec1b-e794-45be-d9bcf41bb656.png)
こんな感じで`Successfully~`が出れば成功です。

###~/Procfile
VSCodeに戻り、[ken-on-kun] の下に [Procfile] というファイルをつくります。拡張子はいりません。
つくったら、エディタでコードを１行書き込み、保存します。
`web: gunicorn run:app --log-file -`
結果をVSCode上で見たらこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/ae14f5ed-28f4-c952-ae16-52c300d00861.png)
紫のHerokuアイコンが付けられて、大切な設定ファイルだよ感が匂い立ちます。
（実際、これがなくてエラーが起きたときに一度完全に迷宮入りし、相当疲弊しました）

###~/requirements.txt
同じく[ken-on-kun] の下に、[requirements.txt] というファイルをつくります。
こちらはターミナルで操作します。

```
% pip freeze > requirements.txt
```
特にエラーがなければ、ファイルが生成されているはずです。
VSCodeを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/e3431849-6c3e-e0ef-ab0c-9103cf3c2c44.png)
ファイルが新設され、内容も勝手に書き込まれています。

これはローカル環境でインストールされていたのパッケージ/ライブラリの一覧を、リモート側に伝えるファイルです。
インターネット上でプログラムを実行する際、Herokuはこの一覧を見て「このパッケージ/ライブラリの、このバージョンが要るのね」とインストールしてくれるようです。
黒ヤギさんと違って、ちゃんと読んでくれて偉いですね。

###Gitコミットして、プッシュする
新しいファイルを２つ追加しましたが、全てローカル側での出来事です。
Gitの変更履歴として記録されているので、忘れずリモートに同期させましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/69f0b39d-e637-4468-83a7-92988e1ccc9e.png)
コミット〜プッシュの手順はさきほどと同じです。レッツビギン！

成功すると、リモート（=Github）のファイル一覧に追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/73966879-6de5-cf84-83e3-226bf9e1997d.png)


#13．Herokuでの設定 〜 WEB公開まで
Herokuのアカウント新規登録の手順は割愛します。ググってください。
サイトにログインした状態からはじめます。

###Heroku内にアプリを作成
ログイン後画面の右上`New`、`Create new app`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/fa9e0324-b9ab-c07b-4eb1-532497145c30.png)

アプリ名を入力（何でもいいですが、リポジトリ名に揃えました）
`Create app`します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/856b36db-6053-048f-b14c-089012fe2b07.png)

###Heroku Postgres アドオンを追加
リモート側でのデータベース管理に、Herokuのアドオン機能「Heroku Postgres」を使います。
[アドオンカタログサイト](https://elements.heroku.com/addons)で検索し、インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/271bd952-f2de-41bf-bdd6-2eb42e42d8c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/3a1f0c22-15ba-7024-0984-9ee5f03178e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/709ca43f-1552-2bd9-caba-7ea9d1c7e9d3.png)
さっきつくったアプリ名を選択して、`Provision add-on`をクリックすると、インストールが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/d0147b94-bd58-7665-af26-6eb7f9a54e38.png)
終わるとこんな画面になります。`Add a Procfile`というウォーニングが出てますが、すでに作ってあるので大丈夫なはず。。。　進みます。

###Heroku CLIをインストール
ターミナル上でHerokuを操作するために必要になります。

```
% brew tap heroku/brew && brew install heroku
```
###Herokuのタイムゾーンを日本時間に変更
これやっとかないと、いろいろ時間がずれます。サーバーは北米のを借りてるし、データベース（HerokuPostgres）は基本UTCで登録するらしいので。

ひきつづきターミナルで作業します。

```
% heroku config:add TZ=Asia/Tokyo
```
うまくいったかは下記で確認できます

```
% heroku run bash
~ % date
```
’date’ を実行したあと、こんな感じで 日本の現在時刻`JST`が返ってくれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/570b8a15-a0cd-0351-10d5-e54c8aac5702.png)

###GithubとHerokuを連携 → デプロイしてみる
この工程は、コチラのサイトがめちゃくちゃ丁寧でわかりやすいです。
”Githubと連携しよう”　のところから参照ください。
[heroku 初級編 - GitHub から deploy してみよう - - Qiita](https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0)

"手動deployを実行しよう!!” のところまで進めると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/ce2938d7-59d3-d29c-c175-a4c03d8d94b7.png)
`Your app was successfully deployed.`と出ました。（ワクワク）
さっそく`View`してみると。。。（ドキドキ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/0796cd11-ee6c-0a7a-a094-727baced4454.png)


Oh...

そんな一筋縄ではいかないですね。



#14．直す
公式ガイドや参考文献をつぎはぎで何とかここまで来ましたが、やはり基礎がない人間は必ずどこかに綻びを作ってしまい、最後の最後ラスボスに一撃されて絶望するんですよね。

でも何度も死の淵から蘇ってきた私はもうあの頃の勇者ではありません。ただのゾンビです。
死んだ目で、淡々とログを見てみましょう。

さきほどheroku CLIをインストールしたので、ターミナルからログが見れます。

```
% heroku logs
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/34f4e3a6-6fc5-80a7-30e2-61bd07e0d7ec.png)
あれ？ これまたエラー。
`Error: Missing required flag:`
これ、なんか見覚えがあるような・・・　ググってみます。

[[Herokuエラー]Error: Missing required flagが出た - Qiita](https://qiita.com/hirokik-0076/items/71c104158fa8b963ba85)

Oh...　ドンピシャ鴨。
記事の通りにやってみます。

```
% git remote -v
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/7669a40d-9594-1da1-7d30-4d5663415fad.png)
はいビンゴ。
記事の通りに直します。

```
% heroku git:remote -a アプリ名
```
これで直ったはず。改めてHelokuのログを見にいきます。

```
% heroku logs
```
ログが出るようになりました！（内容は非公開にさせてもらいます）

heroku logsの見方は、このサイトがとても参考になります。
[エラー時のHerokuのlogの見方 - Qiita](https://qiita.com/koao123/items/fd7abb39a3710b0a3577)

ただ、記事に書かれているような顕著なエラーコードは無く、代わりにこんな１行が。
`Background on this error at: http://sqlalche.me/e/f405`
`sqlalche.me`ってことは、データベースまわりで引っかかってる？

Herokuサイトを見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/8fc985da-b22e-99a5-64b1-28a8e10b1ede.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/674328e6-bd15-0b3d-1e03-52256e4e6fbd.png)

Ohhhh...  DBのテーブル作ってないやんけ。。。

やっぱり基本的な工程漏れ、凡ミスでした。

###Heroku上にDBテーブルをつくる
ターミナルで以下のコマンド実行。`models.py`を実行してデータベースを初期化＝テーブルを作成します。
ローカルでもやってた基本工程ですね。

```
% heroku run python -c "import main.models; main.models.init()" 
```
さて、気を取り直してさっきのHeroku Postgres情報をリロードすると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/e21294e6-5f4e-cd10-b279-04fac9526475.png)


**やたーー！**

胸の鼓動を抑えつつ、Herokuのダッシュボードに戻って`Open App`します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/549d249a-e79e-7046-049e-054d84f4b106.png)


↓↓↓

↓↓↓

↓↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/6e618c82-b971-7103-8fb9-2b9912d87700.png)


**キターーーー！！！！**
お父さんテレビ映ったよー！！！　力道山が空手チ

落ち着いて、データを登録してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/fe3e44ec-b317-75d8-abdf-d1db81f58c9d.png)

↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/731d83a6-4682-8cdc-9e71-38f0d730ff6c.png)
**うひょー入ったーーーー！！！**
**むはーーーー！！！**



#現場からは以上です
というわけで、プロセスもUIもだいぶあらびきですが、

>・Python×Flask ×データベースをつかって検温記録アプリをつくってみる
・WEBで公開するまでの段取りをスルーで実況的にまとめる

ふたつの目的を達成できたので、これにて終了とさせていただきます。

チュートリアルとしては相当クドイですが、特にじぶんと同じ文系/初学者/非エンジニア/趣味レベルの皆さんにとって少しでも刺さるところがあれば本望です。

最後まで読んでいただいた皆様、本当にありがとうございました。
半べそかきつつ、せっかくここまでやり切れたので今後も楽しんでPython続けていきたいと思います。

みなさまも、Happy Coding！

###再掲

この時からアップデートを重ねて、いまではLINEでサクッと記録できるようになりました。一般公開してますので、よろしければお試しください。
[LINE公式アカウント「毎日検温くんβ」](https://lin.ee/CGECIiB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663632/0f1db993-312d-87e6-3891-67258696aa5f.png)