让Flask使用Python3(Apache / mod_wsgi)

时间:2015-06-04 11:39:56

标签: python-3.x flask mod-wsgi

我有一个基本的“hello world”Flask应用程序正在运行。

我使用Apache 2.4在Ubuntu 14.04上。我已经安装了mod_wsgi。

我创建了一个~/web/piFlask/venv/来保存一个安装了flask的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

但我认为这还不够。这个.wsgi实际上是一个将由mod_wsgi执行的Python文件,我肯定会使用Py2.x解释器来执行。

因此,如果我理解正确,mod_wsgi将启动系统Python以执行此.wsgi,这将启动我的~/web/piFlask/venv/解释器以实际处理请求。

我想我可以通过在/etc/apache2/mods-available/wsgi.conf中设置WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages来说服mod_wsgi使用系统Python3或我自己的venv3 / ...

但是我在某个地方发现了一条说明你必须为Py3编译mod_wsgi的指令,并且底部很快就会出现这个问题。

4 个答案:

答案 0 :(得分:13)

我花了一段时间,虽然最后真的很简单。很遗憾,我已经丢失了我的bash历史记录,所以如果您发现错误,请在更正中发表评论或进行修改。

请注意,我已经有mod_wsgi工作了,所以我不得不删除它:

$ a2dismod wsgi
$ sudo apt-get remove libapache2-mod-wsgi
编辑:由于apt-get安装了一个过时的软件包(这会导致一个小错误蔓延到Apache的错误日志中)我不会在撰写本文时建议:

$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi

相反,首先要设置你的py3虚拟环境,(当你在它的时候也可以安装Flask)

$ pip install virtualenv

$ cd ~/web/flaskapp
$ virtualenv -p python3 ./venv3
$ source ./venv3/bin/activate     #  enter virtual environment
$ pip install Flask

现在按照Installing mod_wsgi for Python3 on Ubuntu将mod_wsgi安装到此venv中,然后......

$ deactivate                      #  ... & exit

这是来自最初的apt-get方法,现在它不相关:

  

现在我必须让mod_wsgi使用这个新的Py3:

$ sudo nano /etc/apache2/mods-enabled/wsgi.conf
     

并做:

#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

只是提醒一下,当用户将浏览器指向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>
:

讨论:我将mod_wsgi模块安装到Apache中似乎有些混乱,但它驻留在我的flaskapp文件夹中的venv3中。但这至少可以确保Apache - &gt; mod_wsgi - &gt; (使用正确的iev3 Python) - &gt; {启动我的FlaskApp}。

替代方案是更新系统Python,并使用它而不是venv。

答案 1 :(得分:6)

正确,mod_wsgi需要针对特定​​的Python版本进行编译,因为它从未实际执行过&#39; python&#39;可执行文件。相反,Python库链接到mod_wsgi。

最终结果是您无法在使用Python 2解释器运行的应用程序中混合使用Python 3代码。

您必须考虑在Python 2和3下运行代码,然后您可以选择要使用的代码,并使用为您选择使用的版本编译的mod_wsgi版本。

答案 2 :(得分:1)

我开始在Ubuntu 16.04(虚拟机)的venv中运行带有0.12烧瓶的python3.5.2。

@Graham指出,从WSGI脚本文件中激活venv不是首选方式。更多信息:http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

对于其他任何寻找相关信息的人,我要把所有步骤放在一起:
注意:我的应用名称是炽热的,路径〜/ jan /炽热。用你自己的替换它们。

sudo apt install python3-pip

sudo apt-get install python3-venv
python3 -m venv ~/blazing/venv
source /home/jan/blazing/venv/bin/activate

pip3 install --upgrade pip    
pip3 install Flask

sudo apt-get install apache2-dev
(venv) pip3 install mod_wsgi
(venv) sudo venv3/bin/mod_wsgi-express install-module

输出:
LoadModule wsgi_module&#34; /usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
WSGIPythonHome&#34; / home / jan / blazing / venv&#34;

sudo vim /etc/apache2/mods-available/wsgi_express.load

ADD:LoadModule wsgi_module&#34; /usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"

sudo vim /etc/apache2/mods-available/wsgi_express.conf

ADD:

WSGIPythonHome "/home/jan/blazing/venv"
WSGIPythonPath /home/jan/blazing/venv/lib/python3.x/site-packages

然后

sudo a2enmod wsgi_express

vim /home/jan/blazing/project/flaskapp.wsgi

ADD:

import os, sys

PROJECT_DIR = '/home/jan/blazing' sys.path.insert(0, PROJECT_DIR)

activate_this = os.path.join( PROJECT_DIR, 'venv/bin', 'activate_this.py' )
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this)


from piFlask import app as application application.debug = True

vim /etc/apache2/sites-available/flask.conf

ADD:

WSGIDaemonProcess flaskProcess user=www-data group=www-data threads=5
WSGIScriptAlias /flask /home/jan/blazing/project/flaskapp.wsgi

ErrorLog ${APACHE_LOG_DIR}/error_flask.log #you can see the errors here..
CustomLog ${APACHE_LOG_DIR}/access_flask.log combined

<Location /flask>
    WSGIProcessGroup flaskProcess
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Location>

或者,如果您正在运行其他网站并希望将其作为虚拟主机之一,则可以使用此conf文件:

<VirtualHost *>
    ServerName flask.ubuntuws
    ErrorLog ${APACHE_LOG_DIR}/error_flask.log
    CustomLog ${APACHE_LOG_DIR}/access_flask.log combined

    WSGIDaemonProcess flaskProcess user=www-data group=www-data threads=5
    WSGIScriptAlias / /home/jan/blazing/project/flaskapp.wsgi

    <Location />
        WSGIProcessGroup flaskProcess
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Location>
</VirtualHost>

并确保PROJECT_DIR中的flaskapp.wsgi指向 PROJECT_NAME .py。
启用虚拟站点并重新加载apache:

最后:

sudo a2ensite flask.conf
sudo service apache2 reload

答案 3 :(得分:0)

取自P i的答案。以下现在可以解决问题:

$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi