LoginSignup
1
3

More than 3 years have passed since last update.

[Windows]FlaskのwebアプリをHerokuにデプロイ

Posted at

はじめに

Flaskで作成したアプリのデプロイに詰まったので、記録として残しておきます。

環境

  • Windows10 Home
  • Flask
  • SQLite3(ローカルでの実行)
  • PostgreSQL(デプロイ)

注意

  • HerokuはSQLite3に対応していません
  • GunicornはUnix環境でしか動作しません

Flaskアプリの作成

まず、Github上でリポジトリを作ります。そのうえで、任意のディレクトリにて

git clone <repository url>

をするとgitを使えるようになります。

仮想環境

virtualenvを使って仮想環境を作る場合は、

pip install virtualenv
virutakenv myflaskapp
cd myflaskapp
source bin/activate

これで環境内に入れるはずです。

ファイル構成

今回のファイルでは、以下のような構成をとっています。

main.pyはrunするだけで、__init__.pyに諸々の初期設定を入れ、models.pyにデータベースの設計を入れています。

migrationsフォルダは後述するデータベースの設定をしたときに生成されるものです。このフォルダはデプロイ時に必要となりますので、.gitignoreしないように気を付けてください。

├───main.py
├───requirements.txt
├───migrations
├───myproject
│   │   data.sqlite
│   │   models.py
│   │   __init__.py
│   │
│   ├───static
│   ├───templates
│          base.html
│          home.html
│          404.html

main.py / __init__.py

main.pyは以下のようになっています。

main.py

from flask import render_template
import os

from myproject import app

@app.route('/', methods=['GET', 'POST'])
def index():
    return render_template('home.html')

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)), debug=True)

特に重要なのはapp.runの中で、hostportを必ず設定するようにしてください。(debug=Trueはオプション)

__init__.pyは以下のようになっています。

__init__.py

import os
from flask import Flask, redirect, url_for, flash, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__, static_folder='static', template_folder='templates')

# Often people will also separate these into a separate config.py file
app.config['SECRET_KEY'] = 'mysecretkey'
basedir = os.path.abspath(os.path.dirname(__file__))

# Heroku Postgresアドオンを追加した場合、環境変数DATABASE_URLに
# PostgreSQLデータベースの接続先URLがセットされるので、この値が
# セットされているとき(Heroku上で動作するとき)はそれを使い、
# セットされていないとき(ローカルでのデバッグなど)はローカルのSQLiteデータベースを使うようにする。

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'data.sqlite')

app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
Migrate(app,db)

コメントにあるように、ローカルではSQLiteを使い、Heroku上ではPostgresを使います。

Heroku Postgresアドオンについては後述します。

データベースの初期化

一度初期化して、ローカルで動作することを確認します。

set FLASK=main.py
flask db init
flask db migrate -m "init db"
flask db upgrade

python main.py

これで、http://127.0.0.1:5000/にアクセスし、無事に表示されれば成功しています。

このときに生成されたmigrationsフォルダはgitignoreしないようにしてください。

デプロイ

アプリが完成したとして、次にデプロイします。

Heroku上では、PostgreSQLを使用するので、必要なパッケージをインストールします。

pip install psycopg2

これだけです。

必要なファイルの準備

デプロイに必要なファイルは以下の通りです。

  • Procfile
  • requirements.txt
  • runtime.txt

ほとんどの記事では、gunicornをサーバーに使っていると思うですが、これはUnix派生の環境でのみ動作します。よって、Windows環境でも動作するものを選択するのですが、今回はpythonでwebサーバーを構築するので、以下のようにします。

Procfile
web: python main.py

続いて、requirements.txtですが、psycopg2をインストールしたことにより、必要なインストールはすでに終えているので、次にようにして書き出します。

requirements.txt
pip freeze > requirements.txt

runtime.txtはpythonのバージョン指定に使われます。例えば、python-3.8.5を使用している場合は、

runtime.txt
python-3.8.5

とします。

Heroku CLIのインストールとアカウント作成

Heroku CLIをインストールします。

https://devcenter.heroku.com/articles/heroku-cli#download-and-install

ここにアクセスし、Windows 64-bit installerからインストールしてください。

インストールが完了したら、https://signup.heroku.com/login でアカウント作成します。

Herokuアプリ作成

アカウント作成を完了したら、アプリを作成します。

heroku login
heroku create <アプリ名> # 被らないアプリ名を登録

をやればできます。

Heroku Postgres アドオンの追加

ログインしてアプリを作成したら、Heroku Postgresql アドオンを追加します。これをやらないと、DATABASE_URLを見失ってしまいます。

今回は、無料で使うので、Hobby Devプランを選択します。

heroku addons:create heroku-postgresql:hobby-dev

これで、DATABASE_URLに登録されているはずです。

プッシュ

次に、リモートリポジトリへプッシュします。

git add .                # 新たに作成したファイルがあるため
git commit -m "message"
git push heroku master 

ここで、heroku openをしても、おそらくApplication Errorが表示されます。なので、次を実行します。

Application Error の回避

heroku config:set FLASK_APP=main
heroku run flask db upgrade

このときに、migrationsが必要です。

これで、完了です。

heroku open

でアプリが表示されているはずです。

参考記事

おわりに

これでは動作しない、などの問題がありましたらご指摘の程よろしくお願いいたします。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3