jueves, 3 de junio de 2021

PythonAnywhere subiendo una aplicación Flask desde GitHub

Este es el segundo artículo en una serie de tres que muestran cómo disponer de una aplicación sencilla de Flask en PyuthonAnywhere.

  1. Hola Mundo en PythonAnywhere con Flask
  2. PythonAnywhere subiendo una aplicación Flask desde GitHub ← (es el post en el que estamos)
  3. Flask en PythonAnywhere con despliegue continuo usando GitHub

Podemos seguir una serie de pasos para lograr nuestro objetivo.

1. Creamos el repositorio

Lo primero será crear el repositorio en GitHub donde subiremos el código.

En GitHub existe una página que nos explica cómo crear nuestro repositorio.
Pulsamos sobre el botón New.


Creamos el nuevo repositorio.



Hemos llamado a nuestro repositorio flaskmasterfinan y se encuentra en esta dirección:

Al crear el repositorio nuevo hemos creado también un readme donde podremos explicar brevemente el proyecto.




2. Clonamos el repositorio en local

Suponemos que en nuestro PC tenemos ya instalado git.

Abriendo una terminal en local procedemos a clonar nuestro repositorio. Nos situamos en la carpeta donde tenemos el resto de repositorios en mi caso pyApa que está en Documents.

git clone https://github.com/financieras/flaskmasterfinan.git


La dirección del repositorio acaba en .git y se puede tomar del botón verde Code que muestra la siguiente imagen.


Ya tenemos todos los archivos clonados en local, en una carpeta con el mismo nombre que el repositorio, en nuestro PC.

3. Creamos un entorno virtual

Dentro de la carpeta vamos a crear un entorno virtual para Python. Para ello en la consola dentro de la carpeta del repositorio ejecutaremos una serie de comandos.

Instalar el entorno virtual (virtual environment). Si usamos Python 3 viene con venv que es la nueva forma de instalar el entorno virtual. Si usas Python 2 debes usar el sistema antiguo con virtualenv. En nuestro caso como usamos Python3, usaremos venv que es más sencillo de instalar, demás es el que se recomienda en la instalación de Flask (Instalación 2.0.x).

Actualmente no es necesario instalar virtualenv ya que existe venv que es el que instalamos en nuestro Ubuntu así:

sudo apt install python3-venv
python3 -m venv venv

La segunda venv es el nombre del entorno virtual, podemos asignar el nombre que queramos.


Activación del entorno virtual

El entorno virtual se activa así:

. venv/bin/activate




Dentro del entorno virtual no es necesario poner python3, si ponemos simplemente python ya se sabe que es la versión 3, tal y como se ve en la imagen anterior.

Instalar Flask


Estando dentro del entorno virtual instalar Flask, así:
pip install Flask

Ya tenemos instalada la última versión de Flask, que en este momento es la 2.0.1.


Desactivación del entorno virtual

Veamos cómo desactivar el entorno virtual. El entorno virtual se desactiva así:
deactivate


Para seguir con nuestro proyecto entraremos nuevamente en el entorno virtual.

4. El código de la aplicación

Dentro de la página de Flask existe una guía rápida para comenzar a crear nuestra aplicación básica, un 'Hola mundo'.


Ahora que tenemos montado nuestro entorno virtual en local podemos abrir Visual Studio Code y desarrollar la aplicación.

Para abrir VSCode podemos, estando en la terminal, en el entorno virtual, escribir:

code .

Poner el punto es importante.



Automáticamente se abrirá nuestro Visual Studio Code.



Creamos el archivo app.py

Comenzamos creando una aplicación sencilla de Flask usando el siguiente código.

app.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return '<p>Hello World</p>'

Creamos un .gitignore

Si miramos nuestro VSCode veremos que existen varios cientos de archivos que deben subirse a GitHub, cuando en realidad únicamente hemos creado el archivo app.py. Lo que está sucediendo es que ha detectado todos los archivos necesarios para montar el entorno virtual y si no hacemos nada los subirá a GitHub al hacer un push.



Para evitar que esto suceda crearemos un archivo .gitignore donde anotamos todos los archivos y carpetas que deseamos que no se suban a GitHub.

Ahora queremos subir el codigo del archivo app.py a GitHub pero no los archivos que nos ha generado crear el entorno virtual. Lo solucionamos creando otro archivo llamado .gitignore el punto es importante.

Dentro de él ponemos el nombre de los archivos que no queremos que se suban a nuestro repositorio.

Creamos el archivo .gitignore en la página:


indicando en el formulario los términos: linux, venv, Flask.

Se obtiene esta página:




Solucionado, ahora únicamente VSCode avisa de dos archivos que se han de subir, que son nuestro app.py y el propio .gitignore.

Creamos un requirements.txt

Una de las ventajas del entorno virtual es que nos puede generar un archivo con todas las dependencias que tiene nuestro proyecto, en este caso Flask, usando el comando:

pip freeze>requirements.txt




Como hemos clonado el repositorio, está conectado con GitHub lo que significa que podemos hacer un commit directamente. 

Ya tenemos tres archivos pendientes de subir a GitHub y los subimos abriendo una terminal en VSCode y ejecutando las siguientes líneas en la consola bash.
git add --all
git commit -m "Primera version funcional"
git push


Ya tenemos subida nuestra aplicación básica de Flask a GitHub.

5. La cuenta de PythonAnywhere


Creamos una cuenta gratuita en PyhtonAnyWhere

Nos pedirá rellenar una dirección de correo electrónico y un nombre de usuario que esté disponible. Es importante elegir ese nombre para que sea de nuestro gusto ya que luego se usará en la dirección web. En nuestro caso hemos elegido como nombre de usuario masterfinan que estaba disponible y nadie lo tenía en uso. Esto supone que luego la dirección web que nos den será:


Añadimos una aplicación web

 En la pestaña web veremos un botón que nos invita a añadir una aplicación web.

Pulsamos sobre el botón 'Add a new web app'.




Elegir la última versión de Flask disponible.


Cambiamos el Path por el siguiente.

/home/masterfinan/app.py

donde
  • masterfinan es el usuario de PythoAnywhere que hemos creado
  • app.py es el nombre de la aplicación de Flask que hemos creado



Ahora ya podemos ver la pestaña Web de otra forma.






En este momento ya tenemos desplegada una página web, aunque no se trata de la que hemos programado.

Observamos que arriba pone 'Not secure' esto se debe a que es una página de tipo http y no https. Para conseguir que sea de tipo https debemos activar en la seguridad esta opción.


Ahora al solicitar la página web con https veremos que ya no vemos la advertencia de seguridad.



Configuración de la página web servida


Dentro de la pestaña Web tenemos una línea que dice 'WSGI configuration file: /var/www/masterfinan_pythonanywhere_com_wsgi.py'
Pulsamos sobre el enlace de esa ruta y nos lleva al siguiente archivo.




Vemos que la ruta (path) está correcta y que el nombre de la aplicación es app.

Todo esto está correcto, y por el contrario si recargamos la página esta no se actualiza con la web que nosotros hemos programado, ¿a qué se debe esto?

Podemos comprobar en la pestaña 'Files' los archivos disponibles en este momento.




Si editamos el actual archivo app.py vemos el siguiente código.



Esto explica el motivo por el que no estamos viendo nuestra página de Flask sino una página de Flask que nos proporciona PythonAnywhere por defecto.

La razón por la que no vemos nuestra página se debe a que aún no la hemos subido a PythonAnywhere, de momento solo la tenemos subida a GitHub.

6. Clonado desde PythoAnywhere

Para solucionar el inconveniente anterior lo que haremos es clonar el proyecto desde PythonAnywhere usando la terminal bash que nos proporcionan.

Abrimos una consola bash en PythonAnywhere

Vamos a la pestaña 'Consoles'.




Abrimos una consola Bash.


Miramos los archivos que tenemos.



Clonamos nuestro repositorio

git clone https://github.com/financieras/flaskmasterfinan.git


7. Configuración ruta Web

Source code

Vamos a la pestaña Web y miramos en 'Source code' y cambiamos el path para que sea:

/home/masterfinan/flaskmasterfinan

Observe que hemos añadido al final la carpeta flaskmasterfinan.


WSGI configuration file

Entramos dentro del archivo:
/var/www/masterfinan_pythonanywhere_com_wsgi.py





Editamos el archivo para que contenga en la línea 11 la ruta de la carpeta del repositorio:

project_home = '/home/masterfinan/flaskmasterfinan'


Observe que hemos añadido al final la carpeta flaskmasterfinan con el nombre de nuestro repositorio que se ha creado al hacer el clonado.

En la línea 16 aparece dos veces la palabra app, veamos su significado.
  1. Primer app. Hace referencia al nombre de nuestro archivo app.py que hemos subido al hacer el clonado. Si nuestro archivo no se llamara app.py deberíamos poner aquí el nombre que hubieramos dado a nuestro archivo, sin poner la extensión .py.
  2. Segundo app. Hace referencia al objeto app = Flask(__name__) que aparece en la línea 5 de nuestro archivo app.py. Si el objeto se hubiera llamado de otra forma deberíamos indicar ese nombre en nuestro fichero de configuración WSGI.

8. Recargar y mostrar la página 


En la pestaña Web pulsamos el botón verde denominado 'Reload'.


Finalmente, pulsamos sobre el enlace que apunta a nuestra página:






¡Lo hemos conseguido!

Ya está disponible nuestra página web básica programada en Flask.

Truco

Para recargar una página web sin memoria cache pulsamos simultáneamente las dos teclas: 
Control + F5

9. Modificando la Web

¿Qué hacer si queremos modificar nuestra página web?

Vamos a realizar algún pequeño cambio en nuestro código, en local, en nuestro Visual Studio Code, cambiando ligeramente lo que vamos a mostrar en página web.

Editamos el archivo app.py

Modificamos ligeramente nuestro código.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
  return '<h1>Hola mundo</h1><p>Desde Flask</p>'
Hemos cambiado únicamente la última línea de código.


Subinos el cambio a GitHub

Lo subimos abriendo una terminal en VSCode y ejecutando las siguientes líneas en la consola bash. Tenemos que estar metidos en el entorno virtual.
git add --all
git commit -m "Cambiando el h1 y el p"
git push


Ahora los cambios ha llegado hasta GitHub pero aún no han llegado hasta PythonAnywhere.

Actualizamos los cambios en PythonAnyWhere

Para llevar los cambios desde GitHub, nuestra nube, hasta PythonAnywhere debemos usar la consola bash de éste y hacer un git pull.

git pull


Ya han llegado las modificaciones a PythoAnywhere.


Recargamos la página


Desde la pestaña Web puedes pulsar el botón verde de 'Reload' para recargar la página o puede que esto no sea necesario y la página web se sirva ya con las actualizaciones nada más recargarla.


Ya hemos completado el proceso. Hemos conseguido subir una aplicación sencilla programada en Flask desde nuestro Visual Studio Code, en local, hasta GitHub y finalmente desplegada en PythonAnywhere.

¿Cuál sería el siguiente paso? 

Nos gustaría que se pudiera hacer despliegue contínuo (continuous deployment) de forma que cambiando nuestra aplicación en Visual Studio Code se subiera directamente a PythonAnywhere y se mostrará en página web sin necesidad de realizar tantos pasos. Esto lo atacaremos en un post posterior. Poco a poco y siempre avanzando.

No hay comentarios:

Publicar un comentario