python-3.x - digitalocean - mod_wsgi apache
Hacer que Flask use Python3(Apache/mod_wsgi) (3)
Tengo una aplicación Flask básica "hello world" ejecutándose.
Estoy en Ubuntu 14.04, usando Apache 2.4. Instalé mod_wsgi.
~/web/piFlask/venv/
un ~/web/piFlask/venv/
para mantener un Python2 creado virtualenv con el matraz instalado.
Sin embargo, deseo que mi flaskapp importe un módulo Python3.x que he escrito.
¿Qué debo hacer para que esto suceda?
Intenté crear un ~/web/piFlask/venv3/
y modificar ~/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
Pero no creo que esto sea suficiente. Este .wsgi es, de hecho, un archivo de Python que será ejecutado por mod_wsgi, del cual estoy seguro usará un intérprete Py2.x para realizar la ejecución.
Entonces, si estoy entendiendo correctamente, mod_wsgi dispara el sistema Python para ejecutar este .wsgi, que a su vez activará mi ~/web/piFlask/venv/
intérprete para procesar realmente la solicitud.
Creo que podría persuadir a mod_wsgi para que use un sistema Python3 o mi propio venv3 / ... configurando WSGIPythonPath /home/pi/web/piFlask/venv3/lib/python3.4/site-packages
en / etc / apache2 / mods -disponible / wsgi.conf
Pero encontré una instrucción en alguna parte diciendo que tienes que compilar mod_wsgi para Py3, y la parte inferior cae rápidamente a este problema.
Correcto, mod_wsgi necesita compilarse para una versión específica de Python, ya que en realidad nunca ejecuta el ejecutable ''python''. En cambio, la biblioteca de Python está vinculada a mod_wsgi.
El resultado final es que no se puede combinar el código de Python 3 dentro de una aplicación que se ejecuta con el intérprete de Python 2.
Debería considerar hacer que el código pueda ejecutarse tanto en Python 2 como en 3 y luego puede elegir cuál de los que desea usar y usar una versión de mod_wsgi compilada para la versión que elija usar.
Me tomó un tiempo, aunque fue realmente simple al final. Lamentablemente, he perdido mi historial de bash, así que si encuentras un error, deja un comentario o edítalo en la corrección.
Tenga en cuenta que ya tenía funcionando mod_wsgi, así que tuve que eliminarlo:
$ a2dismod wsgi
$ sudo apt-get remove libapache2-mod-wsgi
EDITAR: Debido a apt-get instalando un paquete desactualizado (que da como resultado un pequeño error que se arrastra en el registro de errores de Apache), al momento de escribir esto no lo recomiendo:
$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi
En su lugar, primero configure su entorno virtual py3 (y también podría instalar Flask en él mientras lo hace)
$ pip install virtualenv
$ cd ~/web/flaskapp
$ virtualenv -p python3 ./venv3
$ source ./venv3/bin/activate # enter virtual environment
$ pip install Flask
Ahora siga Instalando mod_wsgi para Python3 en Ubuntu para instalar mod_wsgi en este venv, y ...
$ deactivate # ... & exit
Esto fue del enfoque original de apt-get, ahora no es relevante:
Ahora tengo que hacer que
mod_wsgi
use este nuevo Py3:
$ sudo nano /etc/apache2/mods-enabled/wsgi.conf
Y hacer:
#WSGIPythonPath directory|directory-1:directory-2:... WSGIPythonPath /home/pi/web/flaskapp/venv3/lib/python3.4/site-packages
Finalmente necesito modificar mi ~ / web / flaskapp / flaskapp.wsgi para que ahora sea compatible con 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 recordatorio de cómo Apache usa mod_wsgi para ejecutar este archivo cuando el usuario apunta su navegador a 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>
:
Discusión: Parece un poco desordenado que estoy instalando el módulo mod_wsgi en Apache, pero reside en un venv3 que está dentro de mi carpeta flaskapp. Pero esto es al menos asegurando que Apache -> mod_wsgi -> (use el correcto, es decir, venv3 Python) -> {para iniciar mi FlaskApp}.
La alternativa sería actualizar el sistema Python, y usar eso en lugar de venv.
Comencé a ejecutar python3.5.2 con el matraz 0.12 en una versión de Ubuntu 16.04 (máquina virtual).
@Graham señaló que activar el venv del archivo de script de WSGI no es la forma preferida. Más información aquí: http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html
Solo para cualquier otra persona que busque información sobre esto, estoy reuniendo todos sus pasos:
Nota: el nombre de mi aplicación es ardiente, path ~ / jan / blazing. Reemplázalos con los tuyos.
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
SALIDA:
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
AÑADIR:
WSGIPythonHome "/home/jan/blazing/venv"
WSGIPythonPath /home/jan/blazing/venv/lib/python3.x/site-packages
entonces
sudo a2enmod wsgi_express
vim /home/jan/blazing/project/flaskapp.wsgi
AÑADIR:
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
y
vim /etc/apache2/sites-available/flask.conf
AÑADIR:
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 si tiene otros sitios en ejecución y desea tener el matraz como uno de los hosts virtuales, puede usar este archivo 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>
y asegúrese de que su PROJECT_DIR
en flaskapp.wsgi
apunte a su PROJECT_NAME .py.
habilitar el sitio virtual y recargar apache:
Finalmente:
sudo a2ensite flask.conf
sudo service apache2 reload