Definir y Acceder a la Base de Datos
La aplicación utilizará una base de datos SQLite para almacenar usuarios y tareas en este proyecto. Python incluye soporte incorporado para SQLite a través del módulo sqlite3.
SQLite es conveniente porque no requiere configurar un servidor de base de datos separado y está integrado en Python. Sin embargo, si varias solicitudes intentan escribir en la base de datos al mismo tiempo, se ralentizarán ya que cada escritura ocurre de forma secuencial. Las aplicaciones pequeñas no notarán esto. Una vez que crezcas, es posible que desees cambiar a una base de datos diferente.
El tutorial no entra en detalles sobre SQL. Si no estás familiarizado con él, la documentación de SQLite describe el lenguaje.
Conectar a la Base de Datos
Lo primero que debes hacer al trabajar con una base de datos SQLite (y la mayoría de las otras bibliotecas de bases de datos de Python) es crear una conexión a ella. Todas las consultas y operaciones se realizan utilizando la conexión, que se cierra después de que se complete el trabajo.
En las aplicaciones web, esta conexión generalmente está vinculada a la solicitud. Se crea en algún momento al manejar una solicitud y se cierra antes de enviar la respuesta.
flask_todolist/db.py
import sqlite3
import click
from flask import current_app, g
def get_db():
if 'db' not in g:
g.db = sqlite3.connect(
current_app.config['DATABASE'],
detect_types=sqlite3.PARSE_DECLTYPES
)
g.db.row_factory = sqlite3.Row
return g.db
def close_db(e=None):
db = g.pop('db', None)
if db is not None:
db.close()
g es un objeto especial que es único para cada solicitud. Se utiliza para almacenar datos a los que varias funciones pueden acceder durante la solicitud. La conexión se almacena y se reutiliza en lugar de crear una nueva conexión si se llama a get_db por segunda vez en la misma solicitud.
current_app es otro objeto especial que apunta a la aplicación Flask que está manejando la solicitud. Dado que utilizaste una fábrica de aplicaciones, no hay un objeto de aplicación al escribir el resto de tu código. get_db se llamará cuando se haya creado la aplicación y esté manejando una solicitud, por lo que se puede utilizar current_app.
sqlite3.connect() establece una conexión con el archivo señalado por la clave de configuración DATABASE. Este archivo no tiene que existir todavía y no existirá hasta que inicialices la base de datos más adelante.
sqlite3.Row indica a la conexión que devuelva filas que se comporten como diccionarios. Esto permite acceder a las columnas por nombre.
close_db verifica si se creó una conexión comprobando si se estableció g.db. Si la conexión existe, se cierra. Más adelante, le indicarás a tu aplicación acerca de la función close_db en la fábrica de aplicaciones para que se llame después de cada solicitud.
Crear las Tablas
En SQLite, los datos se almacenan en tablas y columnas. Estas deben crearse antes de poder almacenar y recuperar datos. Flask_todolist almacenará usuarios en la tabla "user" y los item de las listas en la tabla "item". Crea un archivo con los comandos SQL necesarios para crear tablas vacías:
flask_todolist/schema.sql
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS item;
CREATE TABLE user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
);
CREATE TABLE item (
id INTEGER PRIMARY KEY AUTOINCREMENT,
author_id INTEGER NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
title TEXT NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (author_id) REFERENCES user (id)
);
Agrega las funciones de Python que ejecutarán estos comandos SQL al archivo db.py:
flask_toodlist/db.py
def init_db():
db = get_db()
with current_app.open_resource('schema.sql') as f:
db.executescript(f.read().decode('utf8'))
@click.command('init-db')
def init_db_command():
"""Clear the existing data and create new tables."""
init_db()
click.echo('Wow! Initialized the database.')
open_resource() abre un archivo relativo al paquete “flask_todolist”, lo cual es útil ya que es posible que no se sepa exactamente dónde se encuentra esa ubicación al implementar la aplicación posteriormente. get_db devuelve una conexión de base de datos que se utiliza para ejecutar los comandos leídos desde el archivo.
click.command() define un comando de línea de comandos llamado init-db que llama a la función init_db y muestra un mensaje de éxito al usuario. Puedes leer la sección Command Line Interface para obtener más información sobre cómo escribir comandos.
Registrar con la Aplicación
Las funciones close_db e init_db_command deben registrarse en la instancia de la aplicación; de lo contrario, no serán utilizadas por la aplicación. Sin embargo, dado que se está utilizando una función de fábrica, esa instancia no está disponible al escribir las funciones. En su lugar, escribe una función que tome una aplicación y realice el registro.
flask_todolist/db.py
def init_app(app):
app.teardown_appcontext(close_db)
app.cli.add_command(init_db_command)
app.teardown_appcontext() le indica a Flask que llame a esa función al limpiar después de devolver la respuesta.
app.cli.add_command() agrega un nuevo comando que se puede llamar con el comando flask.
Importa y llama a esta función desde la función de fábrica. Coloca el nuevo código al final de la función de fábrica antes de devolver la aplicación.
flask_todolist/__init__.py
def create_app():
app = ...
# existing code omitted
from . import db
db.init_app(app)
return app
Inicializa el archivo de la base de datos
Ahora que init-db ha sido registrado en la aplicación, se puede llamar usando el comando flask, similar al comando run de la página anterior.
Nota:
Si aún estás ejecutando el servidor desde la página anterior, puedes detener el servidor o ejecutar este comando en una nueva terminal. Si utilizas una nueva terminal, recuerda cambiar al directorio de tu proyecto y activar el entorno como se describe en la sección de instalación.
Ejecuta el comando init-db:
$ flask --app flask_todolist init-db
Se inicializó la base de datos.
Ahora habrá un archivo flask_todolist.sqlite en la carpeta de instance de tu proyecto.
← Configuración de la aplicación | Continúa con Blueprint y Vistas →
En este Post aprenderemos a personalizar la tienda Magento 2. Descubre cómo incorporar JavaScript personalizado para mejorar la funcionalidad y ...
Leer más...Current version of RDBMS is not supported. Used Version: 10.6.17-MariaDB-1:10.6.17+maria~ubu2004. Supported versions: MySQL-8, MySQL-5....
Leer más...Los principales motivos para aprenderLa motivación es uno de los pilares fundamentales en el proceso de aprendizaje del desarrollo web....
Leer más...✨ Dominando el Estilo: Un Viaje al Mundo de CSSEn el universo del desarrollo web, CSS (Cascading Style Sheets) desempeña un papel funda...
Leer más...