【问题标题】:Getting Flask to use Python3 (Apache/mod_wsgi)让 Flask 使用 Python3 (Apache/mod_wsgi)
【发布时间】:2015-08-19 00:12:47
【问题描述】:

我正在运行一个基本的“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.conf 中设置 WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages 来说服 mod_wsgi 使用系统 Python3 或我自己的 venv3/...

但是我在某处发现了一条指令,说你必须为 Py3 编译 mod_wsgi,而底部很快就出现了这个问题。

【问题讨论】:

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


    【解决方案1】:

    花了我一段时间,虽然最后真的很简单。不幸的是,我丢失了我的 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 -> mod_wsgi ->(使用正确的,即 venv3 Python)-> {启动我的 FlaskApp}。

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

    【讨论】:

    • 非常感谢您。我花了很多时间试图找到一种在 python 3 上运行 mod_wsgi 的方法。我不知道的是 python 3 有一个特定的版本。竖起大拇指
    • 太棒了!这是对这类问题的一个很好的答案。
    【解决方案2】:

    正确,mod_wsgi 需要针对特定​​的 Python 版本进行编译,因为它从不实际执行“python”可执行文件。而是将 Python 库链接到 mod_wsgi。

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

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

    【讨论】:

    • 我将只针对 Python3。看起来好像有libapache2-mod-wsgi-py3 - 我可以改为:1. a2disable mod_wsgi,2. 使用 pip 卸载 mod_wsgi,3. 使用 pip3 安装 libapache2-mod-wsgi-py3?
    • 是的。只要您需要的所有代码和任何第三方 Python 模块都支持 Python 3。一切都需要安装在您的 Python 3 虚拟环境中。您不能为不同的 Python 版本混合来自虚拟环境的部分。
    【解决方案3】:

    取自 P i 的答案。现在可以使用以下方法并解决问题:

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

    【讨论】:

      【解决方案4】:

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

      @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
      

      添加: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 作为虚拟主机之一,您可以使用这个 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>
      

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

      最后:

      sudo a2ensite flask.conf
      sudo service apache2 reload
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2012-03-29
      • 2013-09-21
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多