让 Flask 使用 Python3 (Apache/mod_wsgi)
Getting Flask to use Python3 (Apache/mod_wsgi)
我有一个基本的 "hello world" Flask 应用 运行。
我在 Ubuntu 14.04,使用 Apache 2.4。我已经安装 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 实际上是一个 Python 文件,它将被 mod_wsgi 执行,我确信它会使用 Py2.x 解释器来执行。
因此,如果我理解正确,mod_wsgi 启动系统 Python 以执行此 .wsgi,这将反过来启动我的 ~/web/piFlask/venv/
解释器以实际处理请求。
我想我可以通过在 /etc/apache2/mods-available/wsgi.confWSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages
中设置 WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages
说服 mod_wsgi 使用系统 Python3 或我自己的 venv3/... =18=]
但是我在某处发现了一条指令,说你必须为 Py3 编译 mod_wsgi,而底部很快就出现了这个问题。
正确,mod_wsgi 需要针对特定的 Python 版本进行编译,因为它从未真正执行 'python' 可执行文件。相反,Python 库链接到 mod_wsgi.
最终结果是您不能使用 Python 2 解释器在应用程序 运行 中混合使用 Python 3 代码。
你必须考虑让你的代码在 Python 2 和 3 下都可以运行,然后你可以选择你想要使用的那些,并使用为该版本编译的 mod_wsgi 版本你选择使用。
花了我一段时间,虽然最后真的很简单。不幸的是,我丢失了我的 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
现在按照安装mod_wsgi到这个venv,然后...
$ deactivate # ... & exit
这是最初的 apt-get 方法,现在不相关了:
Now I have to make mod_wsgi
use this new Py3:
$ sudo nano /etc/apache2/mods-enabled/wsgi.conf
And do:
#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 -> mod_wsgi ->(使用正确的即 venv3 Python) -> {启动我的 FlaskApp}。
另一种方法是更新系统 Python,并使用它代替 venv。
我开始 运行 python3.5.2,在 Ubuntu 16.04(虚拟机)上的 venv 中使用烧瓶 0.12。
@Graham 指出从 WSGI 脚本文件激活 venv 不是首选方式。更多信息在这里:http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html
我将您所有的步骤汇总在一起,以供其他寻找这方面信息的人使用:
注意:我的应用名称是blazing,路径~/jan/blazing。将它们替换为您自己的。
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 "/usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/jan/blazing/venv"
sudo vim /etc/apache2/mods-available/wsgi_express.load
ADD: LoadModule wsgi_module "/usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
sudo vim /etc/apache2/mods-available/wsgi_express.conf
添加:
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
添加:
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
添加:
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>
或者如果您有其他站点 运行 并且希望将 flask 作为虚拟主机之一,您可以使用此配置文件:
<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>
并确保 flaskapp.wsgi
中的 PROJECT_DIR
指向 PROJECT_NAME.py。
启用虚拟站点并重新加载 apache:
最后:
sudo a2ensite flask.conf
sudo service apache2 reload
摘自小我的回答。以下现在可以解决问题:
$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi
我有一个基本的 "hello world" Flask 应用 运行。
我在 Ubuntu 14.04,使用 Apache 2.4。我已经安装 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 实际上是一个 Python 文件,它将被 mod_wsgi 执行,我确信它会使用 Py2.x 解释器来执行。
因此,如果我理解正确,mod_wsgi 启动系统 Python 以执行此 .wsgi,这将反过来启动我的 ~/web/piFlask/venv/
解释器以实际处理请求。
我想我可以通过在 /etc/apache2/mods-available/wsgi.confWSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages
中设置 WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages
说服 mod_wsgi 使用系统 Python3 或我自己的 venv3/... =18=]
但是我在某处发现了一条指令,说你必须为 Py3 编译 mod_wsgi,而底部很快就出现了这个问题。
正确,mod_wsgi 需要针对特定的 Python 版本进行编译,因为它从未真正执行 'python' 可执行文件。相反,Python 库链接到 mod_wsgi.
最终结果是您不能使用 Python 2 解释器在应用程序 运行 中混合使用 Python 3 代码。
你必须考虑让你的代码在 Python 2 和 3 下都可以运行,然后你可以选择你想要使用的那些,并使用为该版本编译的 mod_wsgi 版本你选择使用。
花了我一段时间,虽然最后真的很简单。不幸的是,我丢失了我的 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
现在按照
$ deactivate # ... & exit
这是最初的 apt-get 方法,现在不相关了:
Now I have to make
mod_wsgi
use this new Py3:$ sudo nano /etc/apache2/mods-enabled/wsgi.conf
And do:
#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 -> mod_wsgi ->(使用正确的即 venv3 Python) -> {启动我的 FlaskApp}。
另一种方法是更新系统 Python,并使用它代替 venv。
我开始 运行 python3.5.2,在 Ubuntu 16.04(虚拟机)上的 venv 中使用烧瓶 0.12。
@Graham 指出从 WSGI 脚本文件激活 venv 不是首选方式。更多信息在这里:http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html
我将您所有的步骤汇总在一起,以供其他寻找这方面信息的人使用:
注意:我的应用名称是blazing,路径~/jan/blazing。将它们替换为您自己的。
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 "/usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/jan/blazing/venv"
sudo vim /etc/apache2/mods-available/wsgi_express.load
ADD: LoadModule wsgi_module "/usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
sudo vim /etc/apache2/mods-available/wsgi_express.conf
添加:
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
添加:
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
添加:
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>
或者如果您有其他站点 运行 并且希望将 flask 作为虚拟主机之一,您可以使用此配置文件:
<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>
并确保 flaskapp.wsgi
中的 PROJECT_DIR
指向 PROJECT_NAME.py。
启用虚拟站点并重新加载 apache:
最后:
sudo a2ensite flask.conf
sudo service apache2 reload
摘自小我的回答。以下现在可以解决问题:
$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi