Python3でFlaskを使って、Herokuへデプロイするまでのチュートリアルです。
- 環境
- やること
- 前提条件
- Herokuにログイン
- Herokuでアプリをcreate
- Heroku Clone
- venvで環境作る
- pipで環境を整える
- Pythonを書く
- Pythonをローカルで試す
- Herokuで必要なファイルを用意する
- 言語の指定
- git add ~ pushでHerokuに追加
- Herokuで確認
- 参考
- あとがき
環境
- Windows 10
- Heroku CLI
- Python3
ぼくのPythonは
Python 3.6.6 :: Anaconda 4.3.1 (64-bit)
が入っています。
やること
手順はこんな感じ。
- Herokuにログイン
- Herokuでアプリをcreate
- Herokuからclone
- venvで仮想環境作る
- pipで環境を整える
- Pythonを書く
- ローカルで試す
- pip freezeで、requirements.txt作成
- runtime.txt作成
- Procfile作成
- git add ~ push
- Herokuで確認
前提条件
前提条件として
- Herokuはユーザ登録済み
- 「必要なもの」に書かれているものはインストール済み
それでは進めていきます。
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している文字列が表示されているはずです。
Herokuで必要なファイルを用意する
Herokuで動作させるために必要なファイルが3つあります。
- requirements.txt
- runtime.txt
- 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!
他の言語の場合や、詳細については、こちらに書かれています。
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で追加していきます。
やることは
- add
- commit
- 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
で、ブラウザを開いてアクセスしてくれます。
Flaskで表示したときと同じ表示がでましたね!
やったー!
参考
これらのページを参考にしました!
ありがとうございました!
あとがき
Herokuへデプロイするまでのチュートリアルでした!
途中躓いたりもありましたが、デプロイまですることができました。
あとはこのリポジトリで作り込んでいけば、アプリを作る事ができます。
躓いたとはいえ、比較的簡単だったので、
「Pythonでなにか作りたい」
という方はかなり良いかと思います!
これからがんばろー!