Package: isyflask-cli
isyflask-cliUn cli para manejar proyectos de API con flask.Se recomienda la instalación de docker para tener las últimas mejoras y actualizaciones. Algunas características sólo están con dockerSe recomienda utilizar el módulovirtualenvpara los proyectos generadosParawindows:python -m venv venv
./venv/Scripts/activateParamacOSolinux:python -m venv venv
source ./venv/Scripts/activatePosteriormente instale el clipip install isyflask-cliPara iniciar un proyecto ejecute el siguiente comando y responda las preguntas que salgan en el prompt:isyflask-cli project init
pip install -r requirements.txtCambie el directorio al generado en el paso anterior. UtilizandoDocker, el proyecto se levanta utilizando el siguiente comando:docker-compose upSi no utiliza docker, necesitará ejecutar lo siguiente:Windows:python -m venv venv
source ./venv/Scripts/activate

set FLASK_APP=api
set FLASK_RUN_HOST=0.0.0.0
set FLASK_ENV=development 

flask db migrate
flask db upgrade
flask run --host=0.0.0.0MacoLinux:python -m venv venv
./venv/Scripts/activate

export FLASK_APP=api
export FLASK_RUN_HOST=0.0.0.0
export FLASK_ENV=development

flask db migrate
flask db upgrade
flask run --host=0.0.0.0Comandos.
└── isy/
    ├── project/
    │   └── init
    └── model/
        └── newisy project initComo se mostró anteriormente este comando nos sirve para inicializar un proyecto con el cli de isyflask.
El promt nos hará una serie de preguntas para configurar nuestro proyecto relacionado con la base de datos de SQL a utilizar. Actualmente isy tiene soporte para las siguientes bases de datos:SQLiteMySQLPostgresSQLMicrosft SQL serverY de igual forma sirve para la configuración del desarrollo si lo queremos trabajar en contenedores, siendodockerla opción para contenedores.Al finalizar, isy nos descargará toda los archivos necesarios para llevar a cabo el proyecto con una configuración inicial lista para subir a un servidor.El encarpetado final será algo similar a lo que se muestra acontinuación, esto puede variar de acuerdo a las variaciones seleccionadas entre la base de datos y el registro de contenedores..
├── /api/
│   ├── /app/
│   │   ├── /Controllers/
│   │   │   ├── __init__.py
│   │   │   └── ExampleController.py
│   │   ├── /Core/
│   │   │   ├── /Controllers/
│   │   │   │   └── BaseController.py
│   │   │   ├── /Data/
│   │   │   │   └── BaseModel.py
│   │   │   └── /Services/
│   │   │       └── BaseService.py
│   │   ├── /Data/
│   │   │   ├── /Enum/
│   │   │   │   ├── http_status_code.py
│   │   │   │   └── request_parts.py
│   │   │   ├── /Interfaces/
│   │   │   │   ├── PaginationResult.py
│   │   │   │   └── ResourceReference.py
│   │   │   └── /Models/
│   │   │       ├── __init__.py
│   │   │       └── Example.py
│   │   ├── /Exceptions/
│   │   │   └── APIException.py
│   │   ├── /Middlewares/
│   │   │   └── auth.py
│   │   ├── /Services/
│   │   │   ├── __init__.py
│   │   │   └── ExampleService.py
│   │   └── /Validators/
│   │       └── RequestValidator.py
│   ├── /config/
│   │   ├── database.py
│   │   └── storage.py
│   ├── /database/
│   │   └── DBConnection.py
│   ├── /routes/
│   │   ├── __init__.py
│   │   └── ExampleRouter.py
│   ├── /storage/
│   │   └── /local/
│   │       ├── .gitkeep
│   │       └── test.txt
│   ├── /utils/
│   │   ├── /notifications/
│   │   │   ├── __init__.py
│   │   │   └── firebase.py
│   │   ├── /storage/
│   │   │   ├── __init__.py
│   │   │   ├── local.py
│   │   │   └── s3.py
│   │   └── http_utils.py
│   └── __init__.py
├── /migrations/
│   ├── /versions/
│   │   └── f610bf799e52_.py
│   ├── alembic.ini
│   ├── env.py
│   ├── README
│   └── script.py.mako
├── /templates/
│   └── /isiflask/
│       ├── controller.txt
│       ├── model.txt
│       ├── routes.txt
│       └── service.txt
├── /tests/
│   ├── messaging_notifications_test.py
│   └── storage_test.py
├── .dockerignore
├── .env.dist
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
├── Environment.py
├── isyflask_project.toml
├── README.md
└── requirements.txtisy model newCon este comando se creará el modelo para la definicion del proyecto, por lo que creará el servicio, el controlador y el ruteo correspondiente.Se creará los archivos correspondientes con el siguiente formato en las ubicaciones:api/app/Data/Models/ModelName.pyapi/app/Data/Services/ModelNameService.pyapi/app/Controllers/ModelNameController.pyapi/routes/ModelNameRouter.pyAsí como moficar los siguientes archivos para el import y ruteo correspondiente:api/app/Data/Models/__ init__.pyapi/app/Data/Services/__ init__.pyapi/app/Controllers/__ init__.pyapi/routes/__ init__.pyapi/__ init__.pyModelos, la base de todoComo se indicó anteriormente, esta estructura se basa para funcionar totalmente en modelos.Un modelo básicamente es la representación en una clase de una estructura de datos (una tabla de una DB relacional en este caso). El cuál tiene una estructura similar a como se muestra a continuación, destacando las partes de los métodos de clases que nos serán útiles posteriormente,fromtypingimportAny,Dict,ListfromsqlalchemyimportColumn,Integer,Stringfrom...Core.Data.BaseModelimportBaseModelclassModelName(BaseModel):""" Table ModelNames Database modelArgs:BaseModel (ORMClass): Parent classReturns:ModelName: Instance of model"""__tablename__='ModelNames'# Nombre de la tabla en la DBid=Column("IdModelName",Integer,primary_key=True)..# Aquí van todas las propiedades (columnas) de nuestro modelo/tabla.# Como se llamará nuestra ruta desde APImodel_path_name="modelname"# Nombre de las propiedades a las que se les podrá aplicar filtrosfilter_columns=[]# Nombre de las relaciones de este modelo con otros (ORM)relationship_names=[]# Nombre delas propiedades a las que se les podrá hacer búsqueda con el método LIKE %search%search_columns=[]# Mapeo de los nombres de propiedades con la respuesta del APIdefproperty_map(self)->Dict:return{"id":"IdModelName"}# Propiedades que se mostrarán en la respuesta del API@classmethoddefdisplay_members(cls_)->List[str]:return["id"]# Reglas de validaciones del modelo antes de guardar en la DB (Revisar Validators)@classmethoddefrules_for_store(cls_)->Dict[str,List[Any]]:return{}# Método que se ejecuta antes de guardar un registro en la base de datosdefbefore_save(self,sesion:Session,*args,**kwargs):pass# Método que se ejecuta después de guardar un registro en la base de datosdefafter_save(self,sesion:Session,*args,**kwargs):pass# Método que se ejecuta antes de actualizar un registro en la base de datosdefbefore_update(self,sesion:Session,*args,**kwargs):pass# Método que se ejecuta después de actualizar un registro en la base de datosdefafter_update(self,sesion:Session,*args,**kwargs):pass# Método que se ejecuta antes de eliiminar un registro en la base de datosdefbefore_delete(self,sesion:Session,*args,**kwargs):pass# Método que se ejecuta después de eliminar un registro en la base de datosdefafter_delete(self,sesion:Session,*args,**kwargs):passSQLAlchemy, Alembic y BlueprintEn esta herramienta, se mezcló el uso principal de estas librerías, por lo que están a su disposición todos los comandos y estructuras de datos para el desarrollo de nuevas features.SQLAlchemyAlembicBlueprint