はじめに
Flaskで作ったWebアプリをPipenvでHerokuに公開する手順を書いた。
requirements.txt
を使わずにPipenvを使っている手順でまとまっているものが無さそうだったので。
前提条件
- pythonがインストールされていること
- pipがインストールされていること
- pipenvがインストールされていること(
pip install pipenv
) - GitのCLIが使えること(Macなら最初から入っている)
- GitHubのアカウントがあること
- Herokuのアカウントがあること(Heroku CLIは不要)
手順
作業ディレクトリ作成
mkdir myapp
cd myapp
依存関係を追加
Pipenvで必要なライブラリの依存関係を定義する。
Pythonは3系を使う。
今回はFlaskアプリを作るので、flask
とgunicorn
の2つを入れる。
pipenv --python 3
pipenv install flask
pipenv install gunicorn
この時点でPipfile
とPipfile.lock
の2ファイルができているはず。
Flaskアプリ作成
アプリケーションの本体を書き、app.py
という名前で保存する。
ここでは簡単のため、以下の内容にする。
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World'
if __name__ == '__main__':
app.run()
ローカルで動くことを確認
ローカルで動作確認をするには以下のようにする。
pipenv run python app.py
(普通にpython app.py
とするとグローバルに定義されたPythonを使ってしまうので注意)
以下のように表示されればOK。
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
ブラウザでhttp://localhost:5000 にアクセスして、期待通りの内容になっているか確認。
上の例だと、「Hello, World」という文字列が表示されていればOK。
Procfile
を作成
公開したときに実行する処理の内容を記載したProcfile
を作成する。
(必ずプロジェクトのルートに置く)
web: gunicorn app:app
Gitに登録
公開する準備として、ここまでの内容をGitに登録する。
git init
git add .
git commit -m "first commit"
GitHubに登録
ブラウザからGitHubにログイン。
新しいリポジトリを作る。(privateでもOK)
指示にしたがってプッシュする
git remote add origin git@github.com:以下略
git branch -M main
git push -u origin main
Herokuと連携して公開
ブラウザからHerokuにログイン。
Create new app。
- App nameに適当なアプリ名を入力。(これが公開するときのURLに含まれることになる。早いもの勝ちなので
myapp
とかはすでに取られている) - Deployment methodにGitHubを指定。
- Connect to GitHubで先ほど作ったGitHubリポジトリを指定。(初めてやるときは認証が入るはず。指示に従っていればOK)
- Automatic DeploysでEnable Automatic Deploysを押す(これでGitHubリポジトリの特定のブランチ(例えば
main
)にプッシュされたことを検知して、自動でデプロイを行うようになる) - 最初のデプロイをしたいので、Manual DeployでDeploy Branchを押す。
ブラウザでhttp://<アプリ名>.herokuapp.comにアクセスして、想定通りの内容になっているか確認。
これで公開ができた。