Python

virtualenv + flask + apache + wsgi で動かすまで

More than 3 years have passed since last update.

virtualenv + flask + apache + wsgi で動かすまで

apacheflaskアプリケーション動かすまでのフローを駆け足で。

Werkzeug ならけっこう簡単に起動までできるけど、
apache + mod_wsgi になると途端にハードル上がるので、ざっくりまとめてみた。

全てmacの場合なので、適宜パス等は読み替えてください。

初期設定

この辺を参考に virtualenv 入れる。
http://qiita.com/k2tanaka/items/5f111612ec1b6d7584a6

mkvirtualenv -p ~/.pythonz/pythons/CPython-2.7.6/bin/python2.7  v2.7.6

workon して pipflask まで入れる。

workon v2.7.6
pip install flask

アプリケーション部分

中身はすごい適当。
とりあえず最小限の例示で。

構成

ファイルパスとかはこの後のapacheのconfに合わせるように。

/Users/kuryu/workspace/test/flask
├── app.wsgi
├── app_templates
│   └── index.html
└── main.py

中身

app.wsgi
# -*- coding:utf-8 -*-

import sys, os

import logging
# apacheのログに出すために必要
logging.basicConfig(stream = sys.stderr)

sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from main import app as application
main.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
from flask import Flask, render_template
from jinja2 import FileSystemLoader

app = Flask(__name__)
# jinja2のtemplateディレクトリ変更してみる
# 別になくてもいい。
# 省略した場合はこのファイルと同じ階層の "templates" になる。
app.jinja_loader = FileSystemLoader(
        os.path.join(os.path.abspath(os.path.dirname(__file__)), 'app_templates')
    )

@app.route("/")
def index():
    from flask import render_template
    return render_template('index.html')

@app.route("/foo")
def foo():
    return "foo"

@app.route("/foo/bar")
def foo_bar():
    return "foobar"

if __name__ == "__main__":
    app.run()
app_templates/index.html
hogehoge

apacheの設定

mod_wsgi の入れ方

は省略。
多分linuxならaptyumで入るか、最初からapacheに同梱されてる。

macなら

brew tap homebrew/apache
brew install mod_wsgi

して

brew info mod_wsgi

すればパスとかわかると思う。

confの設定

vitualenv 使うので、WSGIPythonHomepython の場所を指定する。

flask.conf
## mod_wsgi
LoadModule wsgi_module /usr/local/Cellar/mod_wsgi/3.5/libexec/mod_wsgi.so

WSGIPythonHome /Users/kuryu/.virtualenvs/v2.7.6
WSGIDaemonProcess test user=kuryu group=staff threads=5
WSGIScriptAlias /test /Users/kuryu/workspace/test/flask/app.wsgi
WSGISocketPrefix /var/run/wsgi

<Directory /Users/kuryu/workspace/test/flask>
    Options +ExecCGI
    SetHandler wsgi-script
    AddHandler wsgi-script .wsgi
    Order deny,allow
    Allow from all
</Directory>

apache再起動しておく。

sudo apachectl restart

叩いてみる

WSGIScriptAlias/test って指定してるので、urlはこう。

curl localhost/test/
curl localhost/test/foo
curl localhost/test/foo/bar

以上。

めんどくささの原因の9割はapacheなんだよな…