Webアプリ flask, database, selenium, phantomJSを使ってherokuへデプロイするメモ

herokuとFlaskとデータベースとseleniumとphonotomJS

忘れないうちにメモしておく。少し雑。

目次

heroku

heroku(Official)はPythonを含めた多様な言語のWebアプリをデプロイできるPaaSだ。 公式の通りにやればHelloWorldのデプロイまでは簡単にできる。(仮想環境は必須だが。)

Flask

FlaskはPythonで使えるWebフレームワーク。シンプルさが売りらしい。

herokuとデータベース

データベースを使うこともできる。次の参考はFlaskでのデータベース操作が詳しい。Part IからIVまで読めば、データベースについてはだいたいわかる。

The Flask Mega-Tutorial, Part IV: Database - miguelgrinberg.com

しかし、開発環境と本番環境などで、切り替えが面倒。そこで、config.pyをプロジェクトのルートに作って、そこで起動時にapp.configに読み込むようにする。以下のようなconfig.pyを作り、

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')
    PHANTOMJS_PATH = 'phantomjs'

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
    PHANTOMJS_PATH = os.environ.get('PHANTOMJS_PATH')

class DevelopmentConfig(Config):
    DEBUG = True

class TestingConfig(Config):
    TESTING = True

# Alias
config_list = {
    'development':  'config.DevelopmentConfig',
    'production':   'config.ProductionConfig',
    'testing':      'config.TestingConfig',
}

def configure_app(app):
    # Specify config to load
    config_name = 'development' if not os.environ.get('DATABASE_URL') else 'production'
    app.config.from_object(config_list[config_name])
    print(f'Configured as {config_name}.')

app = Flask(__name__)するところのすぐ後でconifg.configure_app(app)を読み出すようにする。環境変数から環境を判断するようになっているが、ここは任意の方法でいい。

なお、app = Flask(__name__)は、依存関係のループを避ける為、appモジュールの__init__.pyで行っている。

本番環境ではpostgresqlを使うので、pip install psycopg2で内部で必要になるpsycopg2を準備しておくこと。

herokuとseleniumとphantomJS

seleniumは本来Webアプリなどの為のWebブラウザを動かすテスト用ツールだが、とても便利でスクレイピングにも使える。phantomJSはGUIの無いWebブラウザだ。この2つを使用して、heroku上で動かす。

selenium自体はPythonでは、pipで用意できる。phantomJSはローカルではbrewで用意できるが、本番環境のherokuでは、違う方法で用意する必要がある。

公式のダウンロードページ(Download | PhantomJS)からLinux 64bit版をダウンロードしてプロジェクトのbin/フォルダに入れておく、という方法をとった。手順は次のように。

  • Linux 64bit版をダウンロード
  • 圧縮されているので解凍
  • 解凍した中にあるbin/にバイナリがあるので、それをプロジェクトのルートのbin/にコピー
  • gitの管理下に置く
  • 先ほどのconfig.pyでローカル用のpathと本番用のpathを区別する。
    • 上のPHANTOMJS_PATHの部分が該当
  • herokuに環境変数を追加
    • heroku config:set PHANTOMJS_PATH=bin/phantomjs




今までスクレイピングにはPyQueryを使っていた。今回も途中までは使っていたが、スクレイピングしたいページがJavaScriptでロードする仕様になっていたため、PyQueryでは対処できなかった。(自分の知る限り)

seleniumではWebブラウザの動きをそのまま再現するので、クリックやページ遷移、Scriptの作動など幅広くできる。 一方で見える範囲しか要素をいじれないので、少し不便な面もあると感じた。

適材適所で使いわけよう。

タイトルとURLをコピーしました