使用 virtualenv + flask + apache + wsgi 运行直到完成

直到在 virtualenv + flask + apache + wsgi 上运行为止。

这是关于在Apache服务器上运行Flask应用程序的流程的快速概述。

如果使用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

在工作中,使用pip安装flask。

workon v2.7.6
pip install flask

应用程序组件

内容非常随意,暂且以最简单的示例为例。

构成

请将文件路径与后续的Apache配置相匹配。

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

内部内容

# -*- 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
#!/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()
hogehoge

Apache的配置

mod_wsgi的安装方法

可能的自然中文译文:
省略了这句话。
如果是Linux系统,可以通过apt或yum安装,或者直接使用Apache默认安装。

如果是Mac的话

brew tap homebrew/apache
brew install mod_wsgi

brew info mod_wsgi

如果你尝试一下,我想你会理解如何传球。

配置conf文件

使用虚拟环境时,通过WSGIPythonHome指定Python的位置。

## 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

以上。

麻烦的原因有90%是由于Apache引起的。

bannerAds