無償のプログラミング入門講座CS50xをやってみる Final Project Week 2,3
前回、作るWebアプリの概要を考えて新しい技術が出てきたので、今まで課題として提出しているWebアプリにその新しい技術を適用させることにしました。具体的には「ORMの利用」と「Herokuへのデプロイ」が新しい点です。
今回は、Week 9で作成した2つのアプリをORMを使ってデータを扱うように書き換え、Herokuへデプロイしたので復習がてらやったことをまとめてみようと思います。
ORM(SQLAlchemy)の適用
もともとは以下のようにSQL文とPythonのコードが混じったなんとなく気持ち悪いコードだったんですが、
from cs50 import SQL
def get_user_cash(user_id):
cash = db.execute("SELECT * FROM users WHERE id = ?", user_id)[0]["cash"]
return cash
ORMを適用することで以下のように混じった感じなく書けるようになりました。
from sqlalchemy.orm import Session as orm_session
def get_user_cash(user_id):
with orm_session(engine) as ss:
stmt = select(Users.cash).where(Users.id==user_id)
#execute()の戻り値はタプルなので特定カラムを指定した場合以下の様な書き方になる
cash, = ss.execute(stmt).first()
return cash
また、HerokuではSQLite3が利用できない(1日で削除されてしまう)のですが、SQLAlchemyを導入することでデータベースの切り替えも1行書き換えるだけと非常に簡単でした。
Herokuへデプロイ
・Sessionデータの保存先を変更
元々はSessionデータをサーバーのtempフォルダに保存する設定になっていたのですが、Herokuだと動かないのでCookieの身に保存するように変更しました。Cookieだけにすると、期限内のSession情報の無効化が実質できなくなるので、Cookieを抜き取られると危険です。最近ちょっと話題になってました。まぁ、個人プロジェクトですし、一旦いいとは思いますが。
・Procfileを作成
Herokuでサーバーを起動するためにはProcfileを記載する必要があります。以下ページが詳しかったです。
・PostgreSQLへの接続
地味にはまったのが、PostgreSQLのURLが、Herokuが環境変数に入れるものと、SQLAlchemyで通るものでちょっと違ったことです。以下のように書き換えを行っています。
# create engine
DATABASE_URL = os.environ.get('DATABASE_URL') or 'sqlite+pysqlite:///finance.db'
DATABASE_URL = DATABASE_URL.replace('postgres://', 'postgresql://')
engine = create_engine(DATABASE_URL, future=True, echo=True)
と言うことで、WebアプリをHerokuに2つ程デプロイしてみました。そろそろ、課題のWebアプリ作成に入っていこうと思います。