lisz-works

プログラミングと興味を貴方に

Python3のFlaskでHerokuをするチュートリアル

【スポンサーリンク】

Heroku x Python

Python3でFlaskを使って、Herokuへデプロイするまでのチュートリアルです。

環境

  • Windows 10
  • Heroku CLI
  • Python3

ぼくのPythonは

Python 3.6.6 :: Anaconda 4.3.1 (64-bit)

が入っています。

やること

手順はこんな感じ。

  1. Herokuにログイン
  2. Herokuでアプリをcreate
  3. Herokuからclone
  4. venvで仮想環境作る
  5. pipで環境を整える
  6. Pythonを書く
  7. ローカルで試す
  8. pip freezeで、requirements.txt作成
  9. runtime.txt作成
  10. Procfile作成
  11. git add ~ push
  12. Herokuで確認

前提条件

前提条件として

  1. Herokuはユーザ登録済み
  2. 「必要なもの」に書かれているものはインストール済み

それでは進めていきます。

Herokuにログイン

まずはHerokuにログインします。
このコマンドを叩きます。

heroku login

するとこのように表示されるので、すかさずEnterを入力!

heroku: Press any key to open up the browser to login or q to exit:

ブラウザが開き、ログイン画面へ進みます。

ログイン画面へ

Log inボタンを押します。
するとログイン画面が出てくるので、Herokuのアカウント情報を入力してログインします。

ログイン画面

ログインを完了するとこの画面が出てくるので、ブラウザは閉じてOKです。

ログイン完了画面

コンソール上も完了した状態になります。
こんな感じで表示されるはずです。

C:\> heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/browser/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
Logging in... done
Logged in as yourmailaddress@gmail.com

Herokuでアプリをcreate

Herokuにアプリを作成するには

heroku create アプリ名

を使います。

D:\work\heroku>heroku create lztpy
Creating ⬢ lztpy... done
https://lztpy.herokuapp.com/ | https://git.heroku.com/lztpy.git

Herokuに作られているアプリを確認する

heroku apps

で、作成されているアプリ名の一覧を取得することができます。

D:\work\heroku>heroku apps
=== xxx@gmail.com Apps
app1
app2
lztpy

Heroku Clone

Herokuの環境は、gitで管理されているようです。

Herokuのコマンドでgitを操作できるので、cloneでgit環境を取得します。

このコマンドを実行します。

heroku git:clone -a アプリ名

このコマンドはgitの「git clone」と同様、

このようなログが出力されて、.gitフォルダの入った、プロジェクトフォルダが作成されます。

D:\work\heroku>heroku git:clone -a lztpy
Cloning into 'lztpy'...
warning: You appear to have cloned an empty repository.

createしたてだと、.gitフォルダだけ取得されます。

venvで環境作る

venvとは、Pythonに標準で組み込まれている仮想環境を作る仕組みです。

pyvenvというのもあるようですが、Pythonのドキュメント的に

「Python 3.6から非推奨だから、venv使ってね」

と言っています。

仮想環境を作ってみる

venvは、このような構文で使います。

python -m venv 作成する環境名

今回は「env」という名前で作ります。
プロジェクトフォルダに入った状態で

python -m venv env

と叩くと、「env」というフォルダが作成されます。

仮想環境に入る

仮想環境に入るには

環境名\Scripts\activate.bat

を実行します。

実行すると、コンソール表示がリセットされて、プロンプトの先頭に

(env) D:\work\heroku\lztpy>

のように環境名が表示された状態になります。

この状態で、pythonやpipなどのコマンドを実行すれば、仮想環境内の設定で実行することができます。

例えば「pip list」とかすれば、通常時との差がすぐわかると思います。。
普段からPythonに色々ライブラリを入れている方は特に。

pipで環境を整える

仮想環境に入った状態で、必要なライブラリをpipでインストールしていきます。

今回必要なのは

  • flask
  • gunicorn

です。

なのでこの2つを叩けばOKです。

pip install flask
pip install gunicorn

もしかしたらpipのアップグレードを求められるかもしれないので、

python -m pip install --upgrade pip

も一緒に(というか先に)叩く必要があるかもしれません。

Pythonを書く

Flaskを使ったPythonのHello Worldです。コピペでOKです。

# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello'

if __name__ == '__main__':
    app.run()

これを「main.py」という名前で保存しました。

Pythonをローカルで試す

ローカルで試すには、いつもどおり

python main.py

のように実行してあげればOKです。

実行すると

(env) D:\work\heroku\lztpy>python main.py
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

のように出力され、何も入力できない状態になります。
サーバを実行して、そのまま終了待機している状態です。

最後の行に書かれているアドレス「http://127.0.0.1:5000/」をブラウザで開きます。
環境に応じて、後ろの「:5000」の部分が違うかもしれないので、表示されているものでアクセスしましょう!

アクセスすると、Flaskで作成したPythonの

def index():
    return 'Hello'

のreturnしている文字列が表示されているはずです。

Flask 画面表示

Herokuで必要なファイルを用意する

Herokuで動作させるために必要なファイルが3つあります。

  1. requirements.txt
  2. runtime.txt
  3. Procfile

コレを作っていきます

runtime.txt作成

runtime.txtで下記のような内容のテキストファイルを作るだけです。

python-3.6.8

どうやら空白で改行など、無駄な空白とかでエラーになるようです。
この文だけきっちり書くようにしましょう!

requirements.txt作成

「pip freeze」というコマンドを実行すると、現在pipでインストールされているものの一覧が出ます。

これは依存関係も込みなので、単純に

「インストールに指定したflaskとgunicorn書けばいいっしょ!」

ではNGなのです。

ということで、pipの力で勝手にやってもらいます。

pip freeze > requirements.txt

こんな感じでテキストが作られます。

Click==7.0
Flask==1.0.2
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.1
Werkzeug==0.14.1

Procfile作成

「Procfile」という名前でファイルを作ります。
拡張子はなしです。

内容はこんな感じ。

web: gunicorn <実行するファイル名>:app --log-file=-

ぼくの場合、「main.py」が実行するやつなので

web: gunicorn main:app --log-file=-

と記述します。

言語の指定

Herokuには「buildpacks」というものがあるらしく

「この言語ですよ!」

というのを指定してあげる必要があるようです。

Pythonの場合、

heroku buildpacks:set heroku/python

と叩けばOK!

他の言語の場合や、詳細については、こちらに書かれています。

devcenter.heroku.com

buildpacksを指定しないと?

buildpacksが指定されていないと、git pushしたタイミングでこのようなエラーが発生します。

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 lztpy.
remote:
To https://git.heroku.com/lztpy.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/lztpy.git'

git add ~ pushでHerokuに追加

さてココまでで導入したり作ったりしたファイルを、Herokuにgitで追加していきます。

やることは

  1. add
  2. commit
  3. push

です。

cloneとは異なり、ここで使うのは、通常のgitコマンドです。

ファイルの追加: add

一通りのファイルを追加します。

git add .

これでプロジェクト内の全てのファイルを一括で追加できます。

もしファイルを名指しで追加したいみたいなことが起きたら

git add file.txt

のようにすればOKです。

ファイルのコミット: commit

追加したファイルをコミットします。

git commit -m "コメント"

でコミットをします。

ファイルをHerokuへデプロイ!: push

最後にpushでHerokuへ!

git push

正確には

git push heroku master

ですが、git pushで同じことができるので、問題ありませんでした。

最後の方に

remote: Verifying deploy... done.
To https://git.heroku.com/lztpy.git
 * [new branch]      master -> master

と表示があればOKです!

Herokuで確認

Herokuで確認するには

heroku oepn

で、ブラウザを開いてアクセスしてくれます。

Herokuにデプロイした画面の表示

Flaskで表示したときと同じ表示がでましたね!

やったー!

参考

これらのページを参考にしました!
ありがとうございました!

teratail.com

qiita.com

qiita.com

qiita.com

あとがき

Herokuへデプロイするまでのチュートリアルでした!

途中躓いたりもありましたが、デプロイまですることができました。

あとはこのリポジトリで作り込んでいけば、アプリを作る事ができます。

躓いたとはいえ、比較的簡単だったので、

「Pythonでなにか作りたい」

という方はかなり良いかと思います!

これからがんばろー!