2015-06-04 18 views
7

Ho un'app di base "ciao mondo" Flask in esecuzione.Ottenere Flask per usare Python3 (Apache/mod_wsgi)

Sono su Ubuntu 14.04, utilizzando Apache 2.4. Ho installato mod_wsgi.

Ho creato un ~/web/piFlask/venv/ per contenere un Python2 creato da virtualenv con il pallone installato.

Tuttavia, desidero che il mio flaskapp importi un modulo Python3.x che ho scritto.

Cosa devo fare per rendere questo accada?

Ho cercato di creare un ~/web/piFlask/venv3/ e modifica ~/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 

Ma io non credo che questo sia sufficiente. Questo .wsgi è in effetti un file Python che verrà eseguito da mod_wsgi, che sicuramente userò un interprete Py2.x per eseguire l'esecuzione.

Quindi, se sto capendo correttamente, mod_wsgi attiva il sistema Python per eseguire questo .wsgi, che a sua volta spegne il mio interprete ~/web/piFlask/venv/ per elaborare effettivamente la richiesta.

penso che potrei convincere mod_wsgi ad utilizzare un sistema di python3 o il mio venv3/... impostando WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages in /etc/apache2/mods-available/wsgi.conf

ma ho trovato da qualche parte un'istruzione dicendo che devi compilare mod_wsgi per Py3, e il fondo cade rapidamente a questo problema.

risposta

6

Corretto, mod_wsgi deve essere compilato per una versione Python specifica in quanto non esegue mai l'eseguibile 'python'. Invece la libreria Python è collegata a mod_wsgi.

Il risultato finale è che non è possibile combinare il codice Python 3 in un'applicazione in esecuzione utilizzando l'interprete Python 2.

Dovresti considerare di eseguire il codice eseguibile sia con Python 2 sia con 3 e quindi puoi scegliere quali di quelli che vuoi utilizzare e utilizzare una versione di mod_wsgi compilata per la versione che scegli di utilizzare.

+0

sto andando a bersaglio solo python3. Sembra che ci sia 'libapache2-mod-wsgi-py3' - potrei invece farlo: 1. a2disable mod_wsgi, 2. disinstallare mod_wsgi usando pip, 3. installare libapache2-mod-wsgi-py3 usando pip3? –

+1

Sì. Fintanto che tutto il codice e tutti i moduli Python di terze parti di cui hai bisogno sono compatibili con Python 3. Tutto dovrà essere installato nel tuo ambiente virtuale Python 3. Non è possibile mescolare parti da ambienti virtuali per diverse versioni di Python. –

9

Mi ci è voluto un po ', anche se alla fine era davvero semplice. Purtroppo ho perso la cronologia di bash quindi se trovi un errore, lascia un commento o modifica nella correzione.

Nota che avevo già avuto lavoro mod_wsgi, così ho dovuto toglierlo:

$ a2dismod wsgi 
$ sudo apt-get remove libapache2-mod-wsgi 

EDIT: A causa di apt-get l'installazione di un pacchetto obsoleto (che si traduce in un piccolo errore strisciante nel log degli errori di Apache) io non al momento della scrittura consiglio questo:

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

Invece, prima impostare il vostro ambiente virtuale PY3, (e forse anche in installarlo Flask in esso, mentre si è in esso)

012.

Ora seguire Installing mod_wsgi for Python3 on Ubuntu per installare mod_wsgi in questo venv, e ...

$ deactivate      # ... & exit 

Questo è stato l'approccio originale apt-get, ora non è rilevante:

ora devo fare mod_wsgi utilizzare questa nuova PY3:

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

e fare:

#WSGIPythonPath directory|directory-1:directory-2:... 
WSGIPythonPath /home/pi/web/flaskapp/venv3/lib/python3.4/site-packages 

Infine ho bisogno di modificare il mio ~/web/flaskapp/flaskapp.wsgi in modo che ora supporta 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 

Solo un promemoria di come Apache mod_wsgi utilizza per eseguire questo file quando l'utente indica il loro browser per 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> 
: 

Discussione: mi sembra un po 'disordinato, che sto installando il modulo mod_wsgi in Apache, ma risiede in un venv3 che è dentro la mia cartella flaskapp. Ma questo è almeno assicurando Apache -> mod_wsgi -> (usa il corretto ven.v3 Python) -> {per lanciare la mia FlaskApp}.

L'alternativa sarebbe aggiornare il sistema Python e utilizzarlo al posto di venv.

+0

Grazie mille per questo. Ho passato molte ore a cercare un modo per eseguire mod_wsgi su python 3. Quello che non sapevo era che esiste una versione specifica per python 3. Thumbs up – Cyrusville

1

Ho iniziato a eseguire python3.5.2 con il pallone 0.12 in un venv su Ubuntu 16.04 (macchina virtuale).

@Graham ha sottolineato attivando il venv dal file di script WSGI non è il modo preferito. Maggiori informazioni qui: http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

Proprio per chiunque altro alla ricerca di informazioni su questo sto mettendo tutti i tuoi passi insieme:
Nota: il mio nome dell'applicazione è sfolgorante, percorso ~/Gen/ardente. Sostituiscili con il tuo.

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 

USCITA:
LoadModule wsgi_module "/usr/lib/apache2/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so"
WSGIPythonHome "/ home/Gen/ardente/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.così"

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 

poi

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 

e

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> 

O se avete altri siti in esecuzione e vorrebbe avere fiasco come uno degli host virtuali, è possibile utilizzare questo file di configurazione:

<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> 

e assicurarsi che il PROJECT_DIR in flaskapp.wsgi punti per il tuo PROJECT_NAME .py.
abilitare il sito virtuale e ricaricare apache:

infine:

sudo a2ensite flask.conf 
sudo service apache2 reload 
+0

Suggerisci di leggere http://modwsgi.readthedocs.io/en/develop /user-guides/virtual-environments.html per il modo preferito di utilizzare un ambiente virtuale. L'attivazione dal file di script WSGI non è il modo preferito. Inoltre, non è necessario '' WSGIRestrictStdout Off'' poiché questo è l'impostazione predefinita. –

+0

Grazie per il link, aggiornato il mio post. – cristian