使用 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引起的。