FlaskアプリをuWSGIで動かす

uWSGIのインストール

まずは uWSGI のインストール。

takatoh@nightschool $ sudo pip install uwsgi

Successfully installed uwsgi とでて完了。

簡単なアプリでテスト

$HOME/w/test/app.py を次のように書いてテスト。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_worls():
    return 'Hello, world.'

if __name__ == '__main__':
    app.run()
takatoh@nightschool $ pwd
/home/takatoh
takatoh@nightschool $ uwsgi --http :9090 -H w/test/env --wsgi-file w/test/app.py --callable app

http://localhost:9090/ にブラウザでアクセスすると、無事 Hello, world. と表示されたのでOK。
-H オプションは virtualenv の環境のディレクトリを指定している。

書籍管理アプリ Bruschetta を動かす

上で結構すんなり動いたので、簡単にいくかと思ったらそうでもなかった。試行錯誤の上、次のようにして起動に成功。

takatoh@nightschool $ uwsgi --http :9090 --wsgi-file /home/takatoh/w/bruschetta/manage.py --python-path /home/takatoh/w/bruschetta --callable app -H /home/takatoh/w/bruschetta/env

ハマった点は次のとおり:

  • アプリのディレクトリを --python-path で指定しないとダメ
  • --wsgi-file はフルパスで指定しないとダメ
  • --callable は Flask のインスタンスを代入した変数名を指定

--callable について補足。アプリの起動ファイル manage.py は次のようになっている。

from __future__ import print_function
from flask.ext.script import Manager
from bruschetta import app, db

manager = Manager(app)

@manager.command
def init_db():
    db.create_all()

if __name__ == '__main__':
    manager.run()

なので、最初は --callable manager としたけどダメだった。Flask のインスタンスはあくまでも app なので、それを指定しなきゃいけないようだ。

というわけで、無事動いたので今日はここまで。明日はデーモンとして動くようにしてみよう。