web-dev-qa-db-ja.com

FlaskでPython3(Apache / mod_wsgi)を使用する)

基本的な「HelloWorld」Flaskアプリを実行しています。

私はUbuntu14.04を使用しており、Apache2.4を使用しています。 mod_wsgiをインストールしました。

flaskがインストールされたvirtualenvで作成されたPython2を保持するために、~/web/piFlask/venv/を作成しました。

ただし、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はこの.wsgiを実行するためにシステムPythonを起動します。これにより、~/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をコンパイルする必要があるという命令を見つけたので、すぐにこの問題に陥ります。

11
P i

正解です。mod_wsgiは特定のPythonバージョン用にコンパイルする必要があります。これは、実際には「python」実行可能ファイルを実行しないためです。代わりに、Pythonライブラリはmod_wsgiにリンクされています。

最終的には、Python 2インタープリターを使用して実行されているアプリケーション内でPython 2コードを混在させることはできません。

Python 2と3の両方でコードを実行可能にすることを検討する必要があります。次に、どちらを使用するかを選択し、使用するバージョン用にコンパイルされたmod_wsgiのバージョンを使用できます。 。

8

結局は本当に簡単でしたが、しばらく時間がかかりました。残念ながら、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

次に、 buntuにPython3用のmod_wsgiをインストールする に従って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

ユーザーがブラウザーをポイントしたときに、Apacheがmod_wsgiを使用してこのファイルを実行する方法を思い出してください http://myfoo.org/flask

$ 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の代わりにそれを使用することです。

14
P i

Piの答えから取られました。以下が機能し、問題が修正されました。

$ Sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi
1
caspii

Ubuntu 16.04(仮想マシン)のvenvでflask 0.12)を使用してpython3.5.2の実行を開始しました。

@Grahamは、WSGIスクリプトファイルからvenvをアクティブ化することは推奨される方法ではないと指摘しました。詳細はこちら: http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

これに関する情報を探している他の人のために、私はあなたのすべてのステップをまとめています:
注:私のアプリ名はブレイジング、パス〜/ 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>

または、他のサイトを実行していて、仮想ホストの1つとして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>

PROJECT_DIR in flaskapp.wsgiはあなたのPROJECT_NAME。pyを指します。
仮想サイトを有効にしてApacheをリロードします。

最後に:

Sudo a2ensite flask.conf
Sudo service Apache2 reload
1
cristian