Introduccion
En mi trabajo, he estado usando Flask-Potion durante algún tiempo, un marco cuyas principales ventajas son: integración muy conveniente con modelos SQLAlchemy, generación automática de puntos finales crud, presencia de un cliente de pociones (muy conveniente si escribe un servicio API que necesitará usar en otro servicio).
Noté que no hay casi nada sobre la poción de matraz en ruso, pero creo que este marco puede parecer interesante para algunos.
En lugar de un simple artículo de revisión sobre este marco, decidí escribir varios artículos sobre la creación de un sistema de control para la biblioteca Furfur basado en Flask-Potion.
Este sistema debería poder hacer lo siguiente:
- Almacenar información sobre libros (isbn, título, descripción, autor, etc.)
- Almacenar información del usuario (lectores y bibliotecarios)
- Para emitir un libro de la biblioteca por un período determinado con la posibilidad de extensión
En este sistema usaremos las siguientes herramientas:
- PostgreSQL
- Flask, Flask-SQLAlchemy, Flask-JWT, Flask-Potion, Flask-Migrate
Preparación
Esqueleto
Para no recopilar el esqueleto para el proyecto nosotros mismos, utilizaremos la plantilla Valefor cookiecutter, que incluye todas las dependencias anteriores e incluso más.
cookiecutter gh:lemegetonx/valefor
Esta plantilla incluye dos aplicaciones:
- La aplicación es lo principal. Contiene funciones de controlador para jwt, clases mixin para recursos de pociones y modelos sqlalchemy, así como un paquete con configuraciones para la aplicación.
- usuario: al comienzo de la plantilla, contiene solo el modelo de usuario.
Instalación de dependencia
La plantilla usa poesía para resolver dependencias, pero recientemente pip también admite pyproject.toml , por lo que la elección es suya. Aprovecharé la poesía.
poetry install
Configuracion
Para una configuración simplificada, la plantilla usa la biblioteca de sitri. Tendremos que modificar ligeramente la configuración del objeto Sitri.
- Cambia app / config / provider.py . Reemplazaremos SystemCredentialProvider con YamlCredentialProvider para que los datos de autorización para sistemas de terceros se tomen del archivo credential.yaml , que no agregaremos a commits:
from sitri import Sitri from sitri.contrib.yaml import YamlConfigProvider, YamlCredentialProvider configuration = Sitri( config_provider=YamlConfigProvider(yaml_path="./config.yaml"), credential_provider=YamlCredentialProvider(yaml_path="./credential.yaml"), )
PD: más sobre lo que realmente está sucediendo aquí es más fácil de leer en la documentación , en resumen, ahora solo decidimos de dónde obtendremos los datos para la configuración y la autorización.
- Como esencialmente hicimos los mismos proveedores, es mejor reemplazar los guiones bajos en las claves en la llamada get_credential con puntos en database.py .
DB_NAME = configuration.get_credential("db.name", path_mode=True) DB_HOST = configuration.get_credential("db.host", path_mode=True) DB_PASSWORD = configuration.get_credential("db.user.password", path_mode=True) DB_PORT = configuration.get_credential("db.port", path_mode=True) DB_USER = configuration.get_credential("db.user.name", path_mode=True)
Entonces, el archivo config.yaml ya estaba en la plantilla, pero credential.yaml debe escribirlo usted mismo. En la vida real, dichos archivos se agregan necesariamente a .gitignore, pero agregaré la plantilla credential.yaml al repositorio para que su estructura sea comprensible para cualquiera que entre en el proyecto.
Base credential.yaml :
db: name: furfur_db host: localhost port: 5432 user: password: passwd name: admin
Base de datos
La siguiente etapa de nuestra preparación es la implementación del DBMS, en este caso PostgreSQL. Por conveniencia, haré un archivo stack.yaml donde describiré el lanzamiento del contenedor de postgres con los datos que necesitamos.
version: '3.1' services: db: image: postgres restart: always environment: POSTGRES_PASSWORD: passwd POSTGRES_USER: admin POSTGRES_DB: furfur_db ports: - 5432:5432
Como se mencionó anteriormente, la plantilla valefor incluye el modelo de usuario básico necesario para que funcionen los JWT (controladores), por lo que el paso final para preparar la base de datos es la migración (crear una tabla de usuario).
Al estar en la raíz del proyecto, ejecutamos los siguientes comandos:
export FLASK_APP=furfur.app flask db init flask db migrate flask db upgrade
Todo, con la preparación de la base de datos, así como la base general de nuestro sistema, hemos terminado.
Que sigue
En la siguiente parte, hablaremos sobre cómo organizar un sistema de roles simple y la autenticación JWT.
Repositorio del proyecto: https://github.com/Egnod/furfur
Todo lo que se indica en esta parte: https://github.com/Egnod/furfur/releases/tag/0.0.2