P i*_*P i 11 mod-wsgi flask python-3.x
我有一个基本的"hello world"Flask app运行.
我使用Apache 2.4在Ubuntu 14.04上.我已经安装了mod_wsgi.
我创建了一个~/web/piFlask/venv/用于安装virtualenv创建的Python2的瓶子.
但是,我希望我的flaskapp导入我编写的Python3.x模块.
我需要做些什么来实现这一目标?
我尝试创建~/web/piFlask/venv3/并修改~/web/piFlask/piFlask.wsgi:
import os, sys
PROJECT_DIR = '/home/pi/web/piFlask'
activate_this = os.path.join(PROJECT_DIR, 'venv3/bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
sys.path.insert(0, PROJECT_DIR)
from piFlask import app as application
application.debug = True
Run Code Online (Sandbox Code Playgroud)
但我认为这还不够.这个.wsgi实际上是一个将由mod_wsgi执行的Python文件,我肯定会使用Py2.x解释器来执行.
因此,如果我理解正确,mod_wsgi会启动系统Python以执行此.wsgi,这将启动我的~/web/piFlask/venv/解释器以实际处理请求.
我想我可以通过WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages在/etc/apache2/mods-available/wsgi.conf中设置来说服mod_wsgi使用系统Python3或我自己的venv3/...
但我在某个地方发现了一条说明你必须为Py3编译mod_wsgi的指令,并且底部很快就会出现这个问题.
P i*_*P i 14
我花了一段时间,虽然最后真的很简单.不幸的是我丢失了我的bash历史,所以如果你发现错误,请在更正中留下评论或编辑.
请注意,我已经有mod_wsgi工作,所以我不得不删除它:
$ a2dismod wsgi
$ sudo apt-get remove libapache2-mod-wsgi
Run Code Online (Sandbox Code Playgroud)
编辑:由于apt-get安装过时的软件包(导致一个小错误蔓延到Apache的错误日志)我在撰写本文时没有推荐这个:
$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi
Run Code Online (Sandbox Code Playgroud)
相反,首先设置你的py3虚拟环境,(当你在它的时候也可以安装Flask)
$ pip install virtualenv
$ cd ~/web/flaskapp
$ virtualenv -p python3 ./venv3
$ source ./venv3/bin/activate # enter virtual environment
$ pip install Flask
Run Code Online (Sandbox Code Playgroud)
现在按照Ubuntu上的安装mod_wsgi for Python3将mod_wsgi安装到这个venv中,然后......
$ deactivate # ... & exit
Run Code Online (Sandbox Code Playgroud)
这是来自最初的apt-get方法,现在它不相关:
现在我必须
mod_wsgi使用这个新的Py3:Run Code Online (Sandbox Code Playgroud)$ sudo nano /etc/apache2/mods-enabled/wsgi.conf并做:
Run Code Online (Sandbox Code Playgroud)#WSGIPythonPath directory|directory-1:directory-2:... WSGIPythonPath /home/pi/web/flaskapp/venv3/lib/python3.4/site-packages
最后我需要修改我的〜/ web/flaskapp/flaskapp.wsgi,以便它现在支持Python3:
$ cat web/piFlask/piFlask.wsgi
# http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/#creating-a-wsgi-file
# http://www.enigmeta.com/2012/08/16/starting-flask/
# for Py3:
# http://askubuntu.com/questions/488529/pyvenv-3-4-error-returned-non-zero-exit-status-1
import os, sys
PROJECT_DIR = '/home/pi/web/flaskapp'
sys.path.insert(0, PROJECT_DIR)
def execfile(filename):
globals = dict( __file__ = filename )
exec( open(filename).read(), globals )
activate_this = os.path.join( PROJECT_DIR, 'venv3/bin', 'activate_this.py' )
execfile( activate_this )
from piFlask import app as application
application.debug = True
Run Code Online (Sandbox Code Playgroud)
只是提醒一下,当用户将浏览器指向http://myfoo.org/flask时,Apache如何使用mod_wsgi来执行此文件:
$ cat /etc/apache2/sites-available/000-default.conf
:
WSGIDaemonProcess flaskProcess user=pi group=pi threads=5
WSGIScriptAlias /flask /home/pi/web/flaskapp/flaskapp.wsgi
<Location /flask>
WSGIProcessGroup flaskProcess
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Location>
:
Run Code Online (Sandbox Code Playgroud)
讨论:我将mod_wsgi模块安装到Apache中似乎有些混乱,但它驻留在我的flaskapp文件夹中的venv3中.但这至少可以确保Apache - > mod_wsgi - >(使用正确的iev3 Python) - > {启动我的FlaskApp}.
另一种方法是更新系统Python,并使用它代替venv.
正确的,mod_wsgi需要针对特定的Python版本进行编译,因为它实际上从不执行'python'可执行文件.相反,Python库链接到mod_wsgi.
最终结果是您无法在使用Python 2解释器运行的应用程序中混合使用Python 3代码.
您必须考虑使您的代码在Python 2和3下都可运行,然后您可以选择要使用的那些代码,并使用为您选择使用的版本编译的mod_wsgi版本.