2011-09-20
Heroku で Flask + SQLAlchemy を使う
Heroku | Cloud Application Platform
Django は動いたので、さて Flask と SQLAlchemy です。
github
https://github.com/voluntas/heroku-template-flask
環境
Mac OS X Lion でやっているので、Linux や Windows だとまた別だと思います。
必須
Flask をデプロイする準備
最低限必要なのは virtualenv です。
easy_install なり pip で virtualenv が使える環境は作っておきましょう。
$ mkdir heroku-flask-sqlalchemy $ cd heroku-flask-sqlalchemy
$ virtualenv --no-site-packages . $ source bin/activate
何はともあれ Flask をインストール
$ bin/pip install flask
$ bin/pip install gunicorn
heroku は PostgresSQL なので psycopg2 をインストール
$ env ARCHFLAGS="-arch i386 -arch x86_64" bin/pip install psycopg2
ORM として flask-sqlalchemy をインストール
$ bin/pip install flask-sqlalchemy
$ bin/pip install simplejson
ここでインストールしたサイトパッケージに必要なファイルを書き出します
$ bin/pip freeze > requirements.txt
$ mkdir snowflake
中身を表示しておきます
$ cat Procfile web: bin/gunicorn -b 0.0.0.0:$PORT snowflake:app
gunicorn を使ってみました。
snowflake/__init__.py を作って、SQLAlchemy を使ってみます。
ポイントは os.environ.get('DATABASE_URL') です。
import os import simplejson from flask import Flask from flaskext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL') db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) user_name = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True) def __init__(self, user_name, email): self.user_name = user_name self.email = email def __repr__(self): return '<User %r>' % self.user_name @app.route('/') def home(): return simplejson.dumps([ dict(id = u.id, user_name = u.user_name, email = u.email) for u in User.query.all()]) if __name__ == '__main__': app.run()
Flask をデプロイする
さてここからデプロイ作業です。heroku ではデプロイは git を使います。
まずは不要なファイルがコミットされるのを防ぐため、無視リストを作りましょう。
無視リストは heroku-flask ディレクトリ直下に作ります
$ cat >.gitignore <<EOF bin/ include/ lib/ *.pyc EOF
ファイルの確認をしましょう。以下のようなファイルがあるはずです
.git/ .gitignore Procfile bin/ include/ lib/ requirements.txt snowflake/__init__.py
$ git init $ git add . $ git commit -m "Import"
App の作成
$ heroku create --stack cedar Creating fierce-waterfall-1469... done, stack is cedar http://fierce-waterfall-1469.herokuapp.com/ | git@heroku.com:fierce-waterfall-1469.git Git remote heroku added
ここでは fierce-waterfall-1469 と出ていますが、違う表示がされるはずです。それが貴方のアプリ ID です。
heroku create 打つと git に heroku という remote が追加されるはずですので、確認してみて下さい。
$ git remote show heroku * remote heroku Fetch URL: git@heroku.com:fierce-waterfall-1469.git Push URL: git@heroku.com:fierce-waterfall-1469.git HEAD branch: (unknown)
remote heroku の URL にアプリケーション名が登録されていれば問題ありません。
push するまえに共有データベース(無償)を追加しておきましょう
$ heroku addons:add shared-database -----> Adding shared-database to fierce-waterfall-1469... done, v3 (free)
あとは push するだけです。
git push heroku master
heroku 側の Python を起動して初期化しましょう。
$ heroku run bin/python Running bin/python attached to terminal... up, run.6 Python 2.7.1 (r271:86832, Jun 26 2011, 01:08:11) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from snowflake import db >>> db.create_all()
まずは表示してみましょう
http://あなたのアプリ名.herokuapp.com/
[] が表示されていましたか?
あとはデータを追加してみましょう
$ heroku run bin/python
Running bin/python attached to terminal... up, run.6
Python 2.7.1 (r271:86832, Jun 26 2011, 01:08:11)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from snowflake import db
>>> from snowflake import User
>>> admin = User('admin', 'admin@example.com')
>>> guest = User('guest', 'guest@example.com')
>>> db.session.add(admin)
>>> db.session.add(guest)
>>> db.session.commit()
http://あなたのアプリ名.herokuapp.com/
無事 JSON っぽいのが表示されましたか?されていれば成功です。
サンプルデモ
http://fierce-waterfall-1469.herokuapp.com/
感想
django の syncdb イイネ。マイクロフレームワークなだけあって、何もしてくれません。
あと自分が Flask 知らなすぎて大変でした ... ちゃんと勉強しないとなぁ。
さんざん悩んだ結果 heroku run bin/python に気付いたので、後は楽でした。heroku のコマンドが色々わからなかったりしているので、迷うことが多々。
ただ、データベースも気軽に使えるので便利ですねほんっと。heroku pg:reset を使うとデータベースを気軽に消したりも出来る様なので、最初の方はこれでいいかもです。ORM つかっておけばローカルは SQLite で作って上は PG でなんても出来たり。
ただ、個人的には管理画面のある Django が便利かなぁなんて思いました。Flask はこったことをやればやるほどしんどくなりそうですし ... 。
気軽に作れるしなれてしまえば色々出来そうなのでオススメですよ。
参考
heroku
- http://blog.abhiomkar.in/2011/09/17/deploying-django-on-heroku-mac-os-x/
- http://www.askthepony.com/blog/2011/07/getting-django-on-heroku-prancing-8-times-faster/
- https://gist.github.com/1004844
- http://elweb.co/programacion/how-to-host-django-apps-on-heroku/
- http://kzk9.net/deploying-tornado-on-heroku-mac-os-x
flask
- 55 http://www.google.co.jp/url?sa=t&rct=j&q=heroku&source=web&cd=3&ved=0CE8QFjAC&url=http://d.hatena.ne.jp/Voluntas/20110920/1316529816&ei=p3oLT9H8EcmWiQes282NBg&usg=AFQjCNGKnObHOd47H_sNCDvbEDDrjizUEg&sig2=1u-0KlnPyXQAzIn-1_FM9g
- 28 http://d.hatena.ne.jp/blaue_fuchs/20111005/1317802532
- 27 http://b.hatena.ne.jp/entrylist
- 25 http://www.google.co.jp/url?sa=t&rct=j&q=heroku flask&source=web&cd=1&ved=0CCwQFjAA&url=http://d.hatena.ne.jp/Voluntas/20110920/1316529816&ei=yS-hTvPkMa3LmAWCgfWiCQ&usg=AFQjCNGKnObHOd47H_sNCDvbEDDrjizUEg
- 22 http://www.google.co.jp/url?sa=t&rct=j&q=python+flaskext.sqlalchemy+install&source=web&cd=2&ved=0CDgQFjAB&url=http://d.hatena.ne.jp/Voluntas/20110920/1316529816&ei=JSzrTpGdGKTomAXPj5mHCg&usg=AFQjCNGKnObHOd47H_sNCDvbEDDrjizUEg&sig2=KU-HwuwvmOYk
- 20 http://reader.livedoor.com/reader/
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCkQFjAA&url=http://d.hatena.ne.jp/Voluntas/20110920/1316529816&ei=fexmT4PQNKydmQXOvPyBCA&usg=AFQjCNGKnObHOd47H_sNCDvbEDDrjizUEg&sig2=Ab41uxy3fUQadbP7nL31ng
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CDsQFjAC&url=http://d.hatena.ne.jp/Voluntas/20110920/1316529816&ei=8mpxT72_FayRiQfU--3jDw&usg=AFQjCNGKnObHOd47H_sNCDvbEDDrjizUEg&sig2=0aO-nrKmkBIhcF9VfoLbNA
- 19 http://t.co/DE1CeMG0
- 17 http://b.hatena.ne.jp/hotentry/it
