Flaskで作ったWebアプリをHerokuで最速公開するためのheroku-readyというテンプレートを作りました

Flask製のWebアプリを作るとき毎回同じ手順を踏んでいたりして面倒だったので、heroku-readyというテンプレートを作った。特徴は以下のとおり。

  • Heroku連携
  • Python3対応
  • AlembicによるDBのマイグレーション
  • Flask-SQLAlchemy連携
  • Postgresql連携
  • Blueprintを使った構成

現時点で自分が欲しかった機能は実装されている。

INSTALL

git clone https://github.com/okamurayasuyuki/heroku-ready
pyvenv-3.4 venv
source venv/bin/activate
pip install -r requirements.txt

SETUP

次にbasic_app.config.pyのdb_pathを以下のように置き換える。

db_path = 'postgresql://username:password@hostname/db_name'

SETUP For Heroku

$git add .
$git commit -m 'init'
$heroku create
$git push heroku master

HerokuでPostgresqlを使えるようにするためにAddonを追加する。

$heroku addons:add heroku-postgresql:dev

CREATE DB

ローカル

$python -i
>> from basic_app import create_app,db
>> create_app().app_context().push()
>> db.create_all()

リモート(Heroku)

$heroku run python -i

>> from basic_app import create_app,db
>> create_app().app_context().push()
>> db.create_all()

MIGRATE DB

ローカル

$alembic revision --autogenerate -m "add password"
$alembic upgrade head

リモート(Heroku)

$heroku run alembic revision --autogenerate -m "add password"
$heroku run alembic upgrade head

Finally

自分が使っていて不満に思っていたところは多分このテンプレートで解消できたはず。 良かったら使ってみてください。heroku-ready

Pythonのdecoratorを使う。

ケースとしてログインしたユーザーにだけ、見せたい情報があって、それ以外の人が訪れた場合は、ログインしてくださいみたいなメッセージを表示する時にdecoratorは便利。

def login_required(func):
    def inner(*args,**kwargs):
        if request.method == "GET":
            if session.get("current_user") is None:
                flash(u"ログインしてください")
                return redirect("/")
            else:
                return func(*args,**kwargs)
            return func(*args,**kwargs)
    return inner

使い方

@app.route("/secret")
    @login_required
    def secret():
        pass

Pythonのdecoratorを使う。

ケースとしてログインしたユーザーにだけ、見せたい情報があって、それ以外の人が訪れた場合は、ログインしてくださいみたいなメッセージを表示する時にdecoratorは便利。

def login_required(func):
    def inner(*args,**kwargs):
        if request.method == "GET":
            if session.get("current_user") is None:
                flash(u"ログインしてください")
                return redirect("/")
            else:
                return func(*args,**kwargs)
            return func(*args,**kwargs)
    return inner

使い方

@app.route("/secret")
    @login_required
    def secret():
        pass

Homebrewを使ってMacにPostgresqlをセットアップする

今後Herokuを本格的に使っていくことにしたので、Postgresqlのセットアップをメモしておく。

Postgresqlをインストールする

brew install postgresql

初期化

initdb /usr/local/var/postgres -E utf8

データの保存先の設定

.bashrcまたは、.zshenvに書く

export PGDATA=/usr/local/var/postgres

Postgresqlの起動/終了

起動
pg_ctl -l /usr/local/var/postgres/server.log start

終了
pg_ctl -D /usr/local/var/postgres stop -s -m fast

自動起動の設定

mkdir -p ~/Library/LaunchAgents
cp /usr/local/Cellar/postgresql/your_installed_version/homebrew.mxcl.postgresql.plist
~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

ユーザーの作成

psql -U username password

データベースの作成

createdb foo

データベース一覧を確認する

psql -l