Bienvenido, me llamo Miguel y esta vez les traigo un nuevo post.
Como todos sabemos Flask, Flask es un microframework web escrito en Python. Flask tiene muchas ventajas, incluida (para mí) es una forma fácil y ágil de desarrollar servicios web.
Entonces, para implementar nuestra aplicación Flask, nuestro módulo principal a usar se llama mod-wsgi
. Esta biblioteca es mantenida por alguien llamado Graham Dumpleton (aunque escribí este artículo sin pedir su aprobación), y me gustaría agradecerles mucho por mantener estas maravillosas herramientas para nosotros.
Ahora pasemos a cuestiones técnicas. Antes de saber algo sobre mod-wsgi
, encontré un tutorial de Thilina Madumal sobre cómo servir exactamente una aplicación Flask en Apache.
Índice
Prerrequisitos
Como menciona Madumal en su artículo anterior, necesitará preparar algunas instalaciones.
Visual C ++
redistribuible paraVisual Studio
.- Herramientas de compilación de
Visual C ++
(https://visualstudio.microsoft.com/visual-cpp-build-tools/). - Python3 (instalado para todos los usuarios, así que asegúrese de que el directorio de instalación no vaya a «C: / Users»).
Python3-pip
.- XAMPP Apache.
Y esto va a ser muy importante en la máquina de Windows.
ASEGÚRESE DE INSTALAR PYTHON, APACHE Y VISUAL STUDIO COMO EL MISMO BINARIO
. Por ejemplo, todos son versiones de32 bits
o todos son versiones de64 bits
.
Porque si no hiciste todo eso con el mismo binario, te enfrentarás a muchos errores. Esta declaración también mencionada por Graham en este enlace.
En cuanto a mí, utilicé la versión de 64 bits
de Python 3.8
y la versión de 64 bits
de XAMPP Apache
(sí, hay una versión de 64 bits
).
Para el directorio de Python, asumo que residirá en el directorio de archivos de programa, por lo que será algo como «C: / Archivos de programa / Python«.Porque esa es la ruta predeterminada para la instalación de todos los usuarios.
Vamos a llamar a ese directorio para este artículo.
Y para XAMPP Apache
, sería algo así como «C: / XAMPP / Apache» y lo llamaremos directorio .
Ejecute Apache como un servicio de Windows
Ahora, no puedo decirte por qué necesitarías instalarlo como un servicio de Windows. Porque yo personalmente tampoco lo entiendo.
Pero desde mi experiencia personal, usar apache como un servicio de Windows puede ayudarme a comprender un error que se produce. Para hacer eso, abra su símbolo del sistema como administradores.
Cambie su directorio a / bin
.
cd C: / XAMPP / Apache / bin
Después de eso, escriba un comando:
httpd.exe -k instalar
Esto es lo que quiero decir con la comprensión de errores en apache. Porque, como quizás no sepa, todo el proceso de servir Flask en apache no mostrará la mayoría de los errores en los registros de errores.
Y debido a eso, estaba teniendo dificultades para entender qué estaba pasando con mi apache. Al usarlo como servicios de Windows, puedo controlar la mayor parte de lo que sucede con mi apache.
Ahora, después de instalarlo como servicios de Windows, puede usar otro comando que incluye iniciar, detener, reiniciar el servidor o incluso desinstalar Apache del servicio de Windows. Usa el comando como.
httpd.exe -k [command]
Después de iniciar el servidor, pruébelo abriendo su localhost
y debería mostrar la página de bienvenida de xampp
.
Instalación de mod_wsgi
Ahora, la primera ola de errores aparecerá a partir de este paso. Independientemente de los errores que pueda tener, debe mantener la calma y la frialdad. Intentaré abordar la mayoría de los errores que encontré yo mismo, así como los pasos para solucionarlos.
mod-wsgi
directamente, supongo que la mayoría de ustedes está utilizando el entorno virtual para desarrollar una aplicación Flask. Pero si no lo hizo, no es gran cosa.
Te propongo que hagas tu entorno virtual dentro de tu proyecto de trabajo, así será más fácil instalar un requisito para tu proyecto (aunque muchas personas se oponen a este método).
Entonces, si trabajó con un entorno virtual, prepárelo antes de instalar mod-wsgi
.
Thilina Madumal en su tutorial sugiere activar su entorno virtual antes de instalar mod-wsgi
. Pero voy a sugerirle que no utilice ni active su entorno virtual.
Debido a que tenía problemas para cargar mod-wsgi
en Apache si usaba un entorno virtual, instalé mod-wsgi
directamente en mi directorio principal de Python. No se preocupe, aún podrá utilizar un entorno virtual para su proyecto.
Ahora vamos a instalar pip mod-wsgi
en Python. Antes de escribir el comando pip install
en el símbolo del sistema, le sugiero que primero configure una variable de entorno. Es tan fácil como.
establecer MOD_WSGI_APACHE_ROOTDIR =
Esto es solo para asegurar que no haya errores que digan «no hay conjunto de directorios apache». Después de eso, finalmente podemos instalar pip mod-wsgi
.
pip instalar mod-wsgi
Ahora, si encuentra algún error al realizar este paso, le sugiero que intente instalar una versión diferente de mod-wsgi
en este enlace. Encontré 3 tipos de errores al instalar mod-wsgi
.
Primero, no hay un directorio de apache establecido, el segundo es un símbolo externo sin resolver y el tercero es filename.whl
no es compatible con la rueda de esta plataforma.
El primer error que podemos evitar configurando el directorio raíz de Apache. El segundo y tercer error, sin embargo, son un poco complicados.
Básicamente, necesita la versión correcta de mod-wsgi
para su Python, así que intente instalarlo usando una versión diferente del enlace que mencioné antes.
Usando mod-wsgi
en Apache Server
Después de instalar con éxito mod-wsgi
en su Python, ejecute este comando en el símbolo del sistema
mod_wsgi-express módulo-config
Imprimirá una configuración para que la pongamos en apache. Debería imprimir algo como
LoadFile "C: /Python38/python38.dll" LoadModule wsgi_module "C: /python38/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd" WSGIPythonHome "C: / Python38"
Copie la salida de ese comando. Ahora abra el archivo de configuración de Apache en /conf/httpd.conf
y pegue la salida antes de cualquier declaración LoadModule
.
Es posible que desee reiniciar y probar su servidor apache en este punto porque también encontré un error en este paso. Pero resolví ese error simplemente instalando mod-wsgi
en mi directorio principal de Python (sin entorno virtual).
Si de alguna manera insiste en instalarlo en su entorno virtual, la ruta LoadModule
y PythonHome
será diferente del ejemplo anterior (apuntará a su directorio de entorno virtual).
Pero, siempre que no se muestren errores y su servidor se inicie sin problemas, entonces está bien usar un entorno virtual.
Otro error que encontré es «No se puede cargar el módulo en el servidor: % 1
no es una aplicación Win32
válida» . Estos errores significan que está utilizando una versión binaria diferente de la aplicación. O es Python, Apache o incluso el propio mod-wsgi
.
Después de lidiar con esos errores y hacer que su servidor vuelva a funcionar, es posible que desee agregar un puerto de escucha. Esto es así para que no utilice el puerto predeterminado que utiliza Apache, que es el puerto 80
.
Simplemente agregue una línea «Listen» en su httpd.conf
.
Uso de la aplicación VirtualHost for Flask
Después de configurar la configuración principal, abra la configuración del host virtual en apache. Se encuentra en /conf/extra/httpd-vhosts.conf
. Ahora copia esta línea en tu configuración de vhost
.
<VirtualHost *:5000> ServerAdmin admin-name-here ServerName server-name-here (e.g:localhost:5000) WSGIScriptAlias / “F:/myapp/app/index/web.wsgi” DocumentRoot “F:/myapp” <Directory “F:/myapp/app/index”> Require all granted Options Indexes FollowSymLinks Includes ExecCGI </Directory> AddHandler wsgi-script .wsgi ErrorLog “F:/myapp/logs/error.log” CustomLog “F:/myapp/logs/access.log” common </VirtualHost>
Si no ha creado un registro de errores o de acceso, es posible que deba crearlo manualmente. Estos registros resultarán útiles de aquí en adelante.
Puede notar que mi configuración es un poco diferente de la configuración de Thilina Madumal. Eso se debe a que su configuración aparentemente no es suficiente para mi caso. Y como menciona allí, hay tres cosas importantes en esa configuración.
- Nombre del servidor (dominio para su aplicación si lo tiene, o simplemente
localhost
). WSGIScriptAlias
(le dice a Apache qué script ejecutar cuando hay una solicitud para ese dominio).- Por motivos de seguridad, (debería permitir el acceso al
script wsgi
pero no a todo el proyecto).
Entonces, ¿qué agregué a la configuración? Aparentemente, si ejecuto una configuración como la de Thilina Madumal, obtengo un error «AH02809:
Options ExecCGI está desactivado en este directorio: F: /myapp/app/index/web.wsgi
«. Así que agrego una línea dentro de la etiqueta de directorio.
Opciones Índices FollowSymLinks Incluye ExecCGI
Es posible que solo necesite la parte 'Incluye ExecCGI'
, pero copié la línea completa de la configuración principal de Apache (httpd.conf
).
Después de eso, todavía recibí un error. Esta vez dice «F: /myapp/app/index/web.wsgi
no es ejecutable; asegúrese de que los scripts interpretados tengan "#!"
o "!"
primera línea».
Esa declaración de error sugiere que agregue lo que llamamos Shebang o intérprete. Pero no lo necesitaba. Solo necesito agregar una línea
AddHandler wsgi-script .wsgi
Esto es para asegurar que el script wsgi
sea manejado por el manejador de apache.
Y eso es lo que cambié en la configuración del host virtual. Es posible que aún no obtenga estos errores porque aún no ha creado el archivo wsgi
. Pero antes de crearlo, vuelva a httpd.conf
y busque «httpd-vhosts.conf
» Asegúrese de que haya una línea que diga
# Hosts virtuales Incluya conf / extra / httpd-vhosts.conf
Cree un script WSGI
Debe tener en cuenta que es posible que desee cambiar algún orden de directorio de su proyecto. Esto es para garantizar que no haya una importación circular en su aplicación de Python y hacer cumplir la seguridad en su aplicación web.
Siéntase libre de hacer algunas pruebas y errores para el directorio de su proyecto, si cambió el orden de su directorio, debe asegurarse de que el directorio siga siendo correcto en la configuración de vhosts
.
Primero, cree el script wsgi
manualmente (mi script se llama web.wsgi
) y luego cambie el contenido (usando el bloc de notas o vscode
o cualquier otro editor de texto). Luego agregue este comando de Python a su script.
activate_this = ‘F:/myapp/env/Scripts/activate_this.py’ with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this)) import sys sys.path.insert(0, ‘F:/myapp’) from your-app-script import app as application
La opción 'activar esta parte'
solo se usa si está trabajando con un entorno virtual. Si no usó ningún entorno virtual, solo necesita el sistema de importación y más abajo para su script.
your-app-script debería ser algo como from flask import Flask app = Flask(__name__) @app.route(“/”) def hello(): return “Hello World” if __name__ == “__main__”: app.run()
Y esa sería la última configuración que necesita para servir su aplicación Flask al servidor XAMPP Apache en Windows.
Y nuevamente, puede encontrar algunos errores al iniciar su servidor apache. Intente lo más que pueda para descubrir los errores. Puede consultar el registro de errores de Apache, el registro de errores de su aplicación o desde el símbolo del sistema cuando inicie su servidor.
Desde mi experiencia personal, la mayoría de los errores no tiene la documentación adecuada sobre cómo manejarlos. Entonces, la mayoría de las veces, mi forma de manejar esos errores es desde un contexto completamente diferente.
Vincularé algunos documentos importantes sobre este problema y espero que nadie encuentre tantos problemas como yo (pasé dos semanas enteras solo para trabajar en esos errores).
Un agradecimiento especial para Graham Dumpleton por mantener mod-wsgi
y mantenerse activo respondiendo preguntas en muchas plataformas, incluidos GitHub, StackOverflow o incluso algunos grupos de Google. Y a Thilina Madumal por hacerme entender un paso básico para configurar todo esto.
Muchas gracias por leer este artículo.
Añadir comentario