mod_wsgi digitalocean python-3.x flask mod-wsgi

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