¿Cómo crear un contexto de aplicación de Flask para crear una base de datos?

Para crear una base de datos y sus tablas para una aplicación web de Flask necesitamos tener un contexto de aplicación de la misma. Ese será nuestro propósito a cumplir en este tutorial.

Vale la pena recordar que se recomienda utilizar un entorno virtual para instalar los paquetes de flask y flask_sqlalchemy que son los que se necesitan como mínimo para crear una aplicación de flask y controlar la base de datos a través de SQLAlchemy.

Si ya se sabe de antemano cómo crear un entorno virtual de Python, activarlo e instalar paquetes dentro entonces, puedes saltar a la sub-sección: “¿Cómo verificar las versiones de paquetes instalados dentro de un entorno virtual de Python?”.

Si ya se conoce de antemano que existe un problema al crear la base de datos como el siguiente:

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information. 

Entonces se puede saltar a la sección de: “¿Cómo crear una aplicación de Flask con una base de datos?”.

Si ya se tiene una base de datos, y sólo desconocido cómo solucionar el problema del uso de el contexto de aplicación de flask, entonces se puede saltar a la sección de: “¿Cómo crear una base de datos utilizando un contexto de aplicación de Flask?”, y leer de allí en adelante, después de todo esa es la sección que explica el propósito principal de este tutorial.

 ¿Cómo crear un entorno virtual de Python?

Para crear un entorno virtual de Python (donde se instalarán los paquetes después) debemos ejecutar:

python3 -m venv env

El comando anterior crear un entorno virtual con el nombre de “env” (se puede utilizar cualquier otro nombre).

 ¿Cómo activar un entorno virtual de Python?

Para activar un entorno virtual de Python debemos ejecutar un comando cuya sintaxis depende del sistema operativo que se utilice. A continuación de muestran las formas más comunes:

Para GNU/Linux (bash): source env/bin/activate

Para Windows (cmd/símbolo del sistema): env\Scripts\bin\activate

Para Windows (powershell):

  • Primero hay que establecer la política de ejecución para archivos ejecutables (scripts).
  • Después hay que ejecutar el archivo ejecutable: activate.ps1 para activar el entorno virtual de python.

Como se puede observar, hay pasos adicionales para activar el entorno virtual de Python en Windows utilizando Powershell. Existen distintas maneras de lograrlo, a continuación, les muestro las que podrían ser recomendadas para este caso en específico:

Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope CurrentUser

El comando anterior habilitará la ejecución de archivos ejecutables firmados (scripts) para el usuario actual.

Solo después de haber ejecutado el comando anterior es que podremos ejecutar el siguiente comando:

.\env\Scripts\Activate.ps1

Entonces saldrá un mensaje en la ventana de Powershell que dirá más o menos lo siguiente:

env\Scripts\Activate.ps1 is published by CN=Python Software Foundation, O=Python Software
Foundation, L=Wolfeboro, S=New Hampshire, C=US and is not trusted on your system. Only run scripts from trusted
publishers.
[V] Never run [D] Do not run [R] Run once [A] Always run [?] Help (default is “D”):

Allí colocaremos la letra “R” o “A”. “R” para confiar en el script por una sesión, o “A” para confiar en el script siempre. Yo les recomiendo la “R”, aunque para este caso podríamos responder con “A” ya que utilizaremos un script conocido y regularmente utilizado, y como se puede observar en el anterior mensaje pues está firmado por Python Software Foundation.

Y eso sería todo para activar el entorno virtual de Python en Powershell (Windows). Para volver a cambiar la política de ejecución de scripts a como estaba antes basta con ejecutar el siguiente comando:

Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser

Para listar las distintas políticas de ejecución de scripts en Powershell, se puede ejecutar:

Get-ExecutionPolicy -List

Y con una combinación de todo lo aprendiendo se puede cambiar la política de ejecución de scripts para distintos contextos y con distintos niveles de confianza.

¿Cómo instalar paquetes dentro de un entorno virtual de Python?

Para instalar paquetes dentro de un entorno virtual de Python se debe de haber creado un entorno virtual de Python previamente, y además debe de estar activado. Una vez que se haya hecho lo anterior, basta con ejecutar el siguiente comando:

pip install [nombre del paquete]

Que al menos para este caso instalaremos dos paquetes:

  • flask: Para crear el contexto de aplicación de flask.
  • flask_sqlalchemy: Para controlar la base de datos a través de este framework.

Entonces debemos ejecutar el siguiente comando:

pip install flask flask_sqlalchemy

¿Cómo verificar las versiones de paquetes instalados dentro de un entorno virtual de Python?

Ahora, para lograr nuestro objetivo primero debemos verificar las versiones de los paquetes instalados ejecutando el siguiente comando: 

pip list

El resultado de ejecutar el comando anterior será una lista de los paquetes instalados y sus versiones. Allí deberemos de verificar que nuestras versiones sean las siguientes:

  • flask: Debe de ser una versión mayor o igual a 2.2.x.
  • flask_sqlalchemy: Debe ser una versión mayor o igual a  3.x.x.

Si es así, entonces podremos completar las instrucciones que siguen.

¿Cómo crear una aplicación de Flask con una base de datos?

Escribiremos un archivo muy simple para crear una aplicación de flask que utilice una base de datos. El archivo será el siguiente (y para este ejemplo se guardará bajo el nombre de “app.py”):

from flask import Flask
from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
 
import os
 
BASE_DIR = os.path.dirname(__file__)
DB_FILE = os.path.join(BASE_DIR, "development.sqlite3")
DB_URI = "sqlite:///" + DB_FILE
SECRET_KEY = "123"
 
app = Flask(__name__)
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
app.config["SECRET_KEY"] = SECRET_KEY
db = SQLAlchemy(app)
 
class Log(db.Model):
    __tablename__ = "logs"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text)  
 
@app.route("/")
def index():
    return "Index."

Es un archivo simple llamado “app.py” que contiene las líneas necesarias de código para crear una aplicación de flask que utiliza una base de datos a través de flask_sqlalchemy (SQLAlchemy), y define un modelo “Log” para una tabla que se llamará “logs” dentro de SQL y tiene tres columnas que son: id (llave primaria númerica autoincrementable), title (cadena necesaria de máximo 100 caracteres),  y content (almacena texto). La base de datos se creará al mismo nivel que nuestro archivo “app.py” y su nombre será “development.sqlite3”. Ahora necesitamos crear esa base de datos y sus tablas para, posteriormente, poder establecer la conexión con nuestra aplicación de Flask.

¿Cómo crear una base de datos utilizando un contexto de aplicación de Flask?

Finalmente, crearemos y utilizaremos un contexto de aplicación de Flask para crear nuestra base de datos (flask_sqlalchemy/SQLAlchemy).

Hay distintas maneras de lograr nuestro objetivo, la manera más simple es la siguiente:

  • Activar el entorno virtual de python donde se hayan instalado los paquetes de flask y flask_sqlalchemy.
  • Acceder a una shell con un contexto de aplicación de flask, para ello ejecutando el comando: flask shell.

Una vez estemos dentro de la sesión interactiva (al haber ejecutado “flask shell“), vamos a escribir lo siguiente:

>>> db.create_all()

Nótese que los signos “>>> ” no deben de escribirse, esos son solo signos que aparecen para indicar que se está dentro de la sesión interactiva de Python con un contexto de aplicación de flask. Para que quede claro, una vez que se haya ejecutado “flask shell“, dentro de dicha sesión se debe de ejecutar (escribir y presionar la tecla “Enter”): “db.create_all()“.

Y listo, ahora podemos verificar que al mismo nivel de nuestro archivo “app.py” hay un archivo llamado “development.sqlite3” que es nuestra base de datos, y que podemos examinar al ejecutar “sqlite3 developmente.sqlite3” (se debe de tener instalado sqlite3) para abrir una sesión interactiva, y entonces dentro ejecutaremos “.schema” (sí, es necesario añadir el signo “.” como prefijo antes de “schema”) para observar el esquema de la base de datos; si se utilizó el archivo de ejemplo entonces debería de haber un esquema para la tabla “logs”.

Y listo, eso es todo. Pero antes de terminar, se debe decir que hay otra manera de lograr exactamente lo mismo, y es la siguiente:

  • Abrir una sesión interactiva de Python, para ello hay que ejecutar: python3.
  • Dentro de la sesión interactiva hay que importar los objetos de app y db.
  • Crear un contexto de aplicación de flask.
  • Crear la base de datos.

Los anteriores pasos se verían así:

python3

Entonces dentro de la sesión interactiva de python, se ejecutará lo siguiente:

>>> from app import app, db
>>> with app.app_context():
>>>    db.create_all()
>>> exit()

* Nótese que los signos “>>> ” no debe de escribirse, esos son solo signos que aparecen para indicar que se está dentro de la sesión interactiva de Python.

Es muy importante notar que la línea de “db.create_all()” tiene como prefijo una identación. Dicha identación se puede agregar presionando la tecla <Tab> o colocando espacios (se deberá usar la misma cantidad de espacios en cada identación para mantener la consistencia en los bloques de código, por supuesto, aquí es simple porque solo hacemos una identación en esta sesión interactiva) con la barra espaciadora.

Después de eso el resultado debería ser el mismo, que es tener el archivo “development.sqlite3” que es nuestra base de datos para nuestra aplicación.

Ahora sí, eso es todo. Espero que haya sido de utilidad este tutorial.

Conectar una base de datos a una aplicación de Flask (MySQL, SQLite, PostgreSQL)

Para ser capaz de conectar una base de datos a una aplicación de Flask podemos seguir diferentes instrucciones basándonos en diferentes herramientas. En este ejemplo, se utilizará la librería de flask_sqlalchemy la cuál puedes instalar en tu entorno virtual de Python.

Recordemos que esta es una entrada de blog para ayudar a las personas que siguen los cursos referentes a Flask en el canal de ISC School o CodeNoSchool, por lo cual sólo se mencionará lo absolutamente necesario para acabar de entender algún tema “suelto” que se haya tratado durante algún vídeo-tutorial/curso, por lo cual si has encontrado esta entrada sin seguir alguno de estos cursos y tienes algún duda te invito a seguir los cursos/vídeos. Puedes ver los enlaces al final de esta misma entrada.

¿Cómo establezco una URI para conectarme a la base de datos?

El framework de Flask esta basado en el lenguaje de programación de Python por lo cual podemos utilizar las diferentes funciones que este proporciona para construir una URI con cual nos conectaremos a la base de datos.

Hay tres cosas que debes de tener en cuenta:

  1. ¿Qué conector utilizarás?
  2. ¿Cuál es la ruta/dirección a la base de datos?
  3. ¿Cuáles son los datos para la URI de conexión a la base de datos?
  4. ¿Cómo utilizar la base de datos en la aplicación de Flask?
  5. ¿Cómo crear las tablas y columnas de la base de datos?

¿Qué conector o extensión se debe utilizar para conectarse a una base datos?

  • Primero, ¿qué conector debo utilizar?

El conector es una parte muy importante de la URI para realizar la conexión a la base de datos, y se utiliza uno diferente según sea el caso.

# SQLite3 (El más fácil):

sqlite:///
# MySQL/MariaDB (El más común) *:

mysql+mysqlconnector://
# PostgreSQL *:

postgresql+psycopg2://

Tendrás que ser bastante cuidadoso con el número de diagonales que utiliza cada conector.

* Nota: Observa que MySQL/MariaDB y PostgreSQL necesitan necesitan un módulo adicional para funcionar, y los puedes instalar en tu entorno virtual de Python a través de pip de la siguiente manera:

Para MySQL:

pip install mysql_connector flask_sqlalchemy
Para PostgreSQL:

pip install psycopg2 flask_sqlalchem

¿Cómo configurar una ruta hacía la base de datos?

  • Segundo, ¿cómo obtengo de manera correcta una ruta absoluta?

Este paso solo es necesario para configurar una base de datos con SQLite.

Lo más común es que con SQLite necesitemos la ruta absoluta a nuestra base de datos, establecerla es bastante sencillo si conocemos nuestro sistema operativo, pero puedes seguir estás instrucciones para recuperar una ruta absoluta de un archivo a través de Python y que ésta tengo toda la compatibilidad sin importar el sistema operativo en el que te encuentres, pues recordemos que Windows utiliza diagonales inversas y Linux solo diagonales normales.

import os
BASE_DIR =  os.path.abspath(os.path.dirname(__file__))
DB_URI = "sqlite:///" + os.path.join(BASE_DIR, "database.db")

Siendo “database.db” el nombre del archivo de la base de datos. De esa manera, DB_URI es la URI completa para conectar una base de datos de SQLite a tu aplicación de Flask.

¿Cómo configurar una URI de conexión a una base de datos?

  • Tercero, ¿cuál es la URI completa para apuntar a una base de datos?

Ya desde el punto anterior puedes observar una URI completa para SQLite pero aquí te vuelvo a colocar ese y los casos para MySQL/MariaDB y/o PostgreSQL.

# SQLite3:

import os
BASE_DIR =  os.path.abspath(os.path.dirname(__file__))
DB_URI = "sqlite:///" + os.path.join(BASE_DIR, "database.db")
# MySQL/MariaDB:

DB_URI = "mysql+mysqlconnector://{username}:{password}@{hostname}/{databasename}".format(username="", password="", hostname="", databasename="")
# PostgreSQL:

DB_URI = "postgresql+psycopg2://{username}:{password}@{hostname}/{databasename}".format(username="", password="", hostname="", databasename="")

No te olvides de asignar los valores correctos según sea tu caso para las diferentes variables que se están considerando.

¿Cómo utilizar una base de datos en una aplicación de Flask?

  • Cuarto (a): ¿Cómo le indico a mi aplicación de Flask que utilizará una base de datos?

Como se menciono al principio de esta entrada, lo que se utilizará para manejar la base de datos a través de la aplicación de Flask es la librería flask_sqlalchemy, así que es a esta librería a la que le debemos de indicar nuestra URI de conexión. Para ello utilizamos los parámetros de configuración de nuestra aplicación:

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
  • Cuarto (b): ¿Cómo utilizo la base de datos en una aplicación de Flask?

Está información se sale del tema principal pero a grandes rasgos lo que debes hacer es crear el objeto de la base de datos:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

Crear un esquema a partir de clases de Python, y después aplicar ese esquema a la base de datos.

¿Cómo crear las tablas y columnas de una base de datos de Flask SQLAlchemy?

  • Quinto, ¿Cómo crear los modelos de la base de datos?

Simplemente debes asegurarte de has creado un entorno virtual de Python, e instalado allí los paquetes de flask, flask_sqlalchemy, y algún módulo para instalar la extensión de conexión (conector) si es necesario (ya sea para mysql/mariadb o postgresql). Una vez que haz activado dicho entorno virtual podrás ejecutar el siguiente comando: “flask shell”. Ello iniciará una sesión interactiva con un contexto de aplicación de Flask, que será necesario para crear las tablas y columnas de los modelos que se hayan definido para la aplicación.

Dentro de la sesión interactiva de Flask (el resultado de ejecutar “flask shell”) se deberá ejecutar el siguiente comando:

>>> db.create_all()

Los signos de “>>>” indican que se está dentro de la sesión interactiva de Flask/Python, y no deben de ser escritos.

Final!

Y listo, a partir de allí sólo queda que utilizar la base de datos y todas sus operaciones a través de la aplicación de Flask.

Para más información y ver el proceso a detalle puedes observar los siguientes cursos y los vídeos que correspondan a base de datos:

Curso de Flask: https://www.youtube.com/playlist?list=PLBO4apWPK7b7K6c-jpEI0zflZYDjVp7cd

Curso de REST APIs: https://www.youtube.com/playlist?list=PLBO4apWPK7b6tRI_B1MQGZfvI6c3ViQd-

Notas de Ayuda para Flask (Curso Básico)

ISC & CodeNoSchool

Curso de Otoño, 2017

Tutor: Jessy Kizlex Martz

Email: [email protected]

CURSO BÁSICO FLASK
HTTP

___

Notas de ayuda para el curso.

¿Qué es el protocolo HTTP?

Hypertext Transfer Protocol o HTTP es el protocolo de comunicación que permite las transferencias de información en la World Wide Web. HTTP fue desarrollado por el World Wide Web Consortium y la Internet Engineering Task Force, colaboración que culminó en 1999 con la publicación de una serie de RFC, el más importante de ellos es el RFC 2616 que especifica la versión 1.1. HTTP define la sintaxis y la semántica que utilizan los elementos de software de la arquitectura web para comunicarse. (Wikipedia)

  • El protocolo HTTP usa varios verbos para comunicarse:
    • GET
    • POST
    • PUT
    • DELETE

De los cuales los más populares son GET y POST, pues GET se utiliza para obtener algún recurso del servidor accediendo a través de una URI/URL y POST para enviar datos, por ejemplo, para utilizar GET basta con acceder a una página web estándar, y para utilizar POST puedes utilizar un formulario de registro de usuario.

Comunicación cliente-servidor

  • Esta comunicación se basa principalmente en dos cosas:
    • Petición
    • Respuesta

¿A qué nos referimos con petición y respuesta en este contexto?

Puedes utilizar la definición literal de estas palabras, y entenderlo mejor con la información que se presenta a continuación.

¿Cómo funcionan las peticiones y respuestas?

Normalmente el cliente es quién envía una petición y el servidor quién provee una respuesta. Por ejemplo, cuando accedemos a una página como https://codenoschool.vivaldi.net/ estamos mandando una petición a través del protocolo HTTP utilizando el verbo GET para que el servidor nos provea una respuesta, esta respuesta da como resultado el poder visualizar los elementos que pertenecen a la página que estamos accediendo.

Las peticiones poseen ciertas características además de los verbos que utilizan para que estas se comporten de una manera u otra, a estas características se les conocen como cabeceras y en ellas va información que utilizará el servidor para saber cómo gestionar la petición y dar una respuesta específica, por ejemplo: Host, User-Agent, Accept-Language, Cookie, Content-Type, entre muchas otras. Además tienen en algunas ocasiones poseen un cuerpo y es allí donde se indican las acciones que realizará la petición (dependiendo de que se trate, a veces puede no llevar cuerpo).

Al igual que las peticiones, las respuestas se comportan de la misma manera, utilizando cabeceras para dar información acerca de la respuesta que se está dando y de esa manera quién la reciba pueda interpretar el contenido de la misma y obtener la información y/o datos.

Estado de las peticiones.

Se le asigna un estado a cada petición dependiendo del resultado de la misma, dos de los más conocidos son el estado 200 y 404, siendo el 200 una petición exitosa (OK), y 404 el estado para una petición que no encontró el recurso que estaba buscando (Error). Pero existen una lista de estos estados, que puedes consultar aquí: Anexo:Códigos de estado HTTP.

¿Dónde se pueden aplicar estos conceptos?

A diario nos relacionamos con ellos al navegador por Internet incluso sin darnos cuenta, pero si estás estudiando programación y te has interesado por el desarrollo web estos son algunos de los conceptos más comunes que encontrarás a la hora de aprender a desarrollar aplicaciones web.

Para aprender a construir un sitio web dinámico completo debes aprender a gestionar el área cliente-servidor (frontend-backend), ¿Cómo? ¿Necesitas más información? Te invitamos a que formes parte del: Curso de Desarrollo Web Gratuito de Flask (Python). Aprenderás mucho, no te arrepentirás, te esperamos!

 

¿Necesitas esta información? Puedes descargar/visualizar el documento aquí: Ayuda para Flask (Curso Básico)

Flask (Curso de Desarrollo Web Gratuito!)

Flask es un micro-framework basado en Python para Desarrollo Web. Podemos crear aplicaciones web (desde páginas estáticas hasta dinámicas, qué son estás últimas las que realmente nos interesan) de una manera ágil y sencilla, además necesitamos pocos conocimientos.

Curso de Flask. Este será el primer curso totalmente gratuito de CodeNoSchool, esperamos que puedas sacarle el máximo provecho.

Durante este curso podrás aprender desde conocimientos básicos hasta generar tu primer proyecto y hacerlo disponible para el público en general.

Los conocimientos previos que necesitas para seguir este curso son muy pocos:

  • Fundamentos de Programación.
  • Bases de HTML
  • … y poco más.

Puedes seguir el curso desde la siguiente lista de reproducción en YouTube, de esa manera podrás estudiar a tu ritmo y además tendrás los vídeos a tu disposición siempre.

Ir al curso de Flask (Clic en el siguiente enlace): CURSO DE FLASK (CodeNoSchool)

Te esperamos, y suerte!

* Información adicional: El curso esta bien organizado y cuidado por lo cual la cantidad de errores que tendrás a lo largo del curso es mínima, de cualquier manera puedes dejar tu comentario/duda en cada vídeo del curso, estaremos atendiendo a brevedad posible.

ISC & CodeNoSchool en Vivaldi

Bienvenidos a todas las personas que siguen a la comunidad de ISC & CodeNoSchool en distintos lugares (YouTube, GitHub, etc).

Ahora hemos creado un blog en Vivaldi, ¿por qué? Siempre nos ha gustado este navegador (Vivaldi), desde hace mucho tiempo que lo usamos, tanto así que lo usábamos incluso antes de que saliera una versión oficial (hicimos pequeñas contribuciones para personalizar el uso del navegador en su versión beta). Y desde aquel entonces hasta ahora nos ha sido útil para trabajar

CodeNoSchool
¡Únete a nuestra comunidad!

de manera rápida y personalizada.

 

Quiénes hayan tomado algún curso con nosotros sabrán que nos encanta usar los atajos de teclado (aunque a veces no los usamos todos para no confundir a la audiencia), por ejemplo, en la terminal/consola, en el editor de código (Vim, VSCode), en el mismo sistema operativo, y que mejor que también usarlos en el navegador y para eso usamos Vivaldi. Hacer combinaciones de herramientas como las que acabamos de mencionar sin duda impulsa nuestra productividad a la hora del trabajo.

Por otro lado, también nos gusta personalizar nuestro lugar de trabajo, y Vivaldi nos permite establecer temas personalizados que nos agradan bastante.

Desde hace mucho que se nos permite participar en la comunidad de Vivaldi, y nos han devuelto ese favor permitiéndonos tener un

ISC School
¡Proyectos completos!

correo electrónico, participar en foros, y ahora con los blogs, que desde hace tiempo existen pero que ahora han añadido algo muy parecido al backend de WordPress que nos permite personalizar y administrar nuestro blog de manera más sencilla.

 

Así que, por esas y muchas más sorpresas que apostamos vienen el futuro decidimos participar en esta comunidad a través un blog.

 

Anímense a unirse a la comunidad y disfrutar de todos estos beneficios, claro, nos referimos tanto a la nuestra como la de Vivaldi.

¡Suerte! Y esperamos verlos leyéndonos por aquí y siguiendo nuestros cursos.