Proyecto base para aplicaciones Flask con ejemplos de configuración, testing y buenas prácticas.
- Instalación
- Variables de Entorno
- Ejecutar Aplicación
- Testing
- Tests de Aceptación
- Tests de Rendimiento
- Swagger
- Links de Referencia
Para instalar python debemos bajarlo e instalarlo de la siguiente pagina https://www.python.org/downloads/
Para crear el entorno virtual debemos ejecutar el siguiente comando
python3 -m venv .venvPara instalar las dependencias debemos ejecutar el siguiente comando
pip install -r requirements.txtCuando nos encontremos con una depencia exclusiva para windows debemos agregarle ;sys_platform == 'win32' al final de la version de la dependencia en el archivo requirements.txt
Ejemplo
pywin32==306;sys_platform == 'win32'Entonces cuando instalemos las dependencias del proyecto en un sistema operativo como linux, macOS excluira esa libreria
Para actualizar las dependencias en el archivo requeriments.txt debemos ejecutar el siguiente comando
pip freeze > requirements.txtPara crear el archivo de dependencias en formato JSON debemos ejecutar el siguiente comando
pip list --format json > requirements.jsonSe debe ejecutar el siguiente comando
pip list --format jsonEste proyecto utiliza dotenv por lo que podemos crear el archivo .env con las siguientes variables
SECRET_KEY=sasfdfsdsdf
JWT_SECRET_KEY=sasfdfssas
Estas variables son las llaves secretas que se obtienen por variable de entorno, internamente las usa flask por defecto
Se debe ejecutar el siguiente comando
flask --app app runA continuacion dejo los comandos a utilizar para generar la imagen y posteriormente ejecutarla
Para generar la imagen debemos utilizar el siguiente comando
docker build -t python-flask .Para ejecutar la imagen debemos utilizar el siguiente comando
docker run -p 5000:5000 python-flaskSe debe crear un archivo pyproject.toml con el siguiente contenido
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.coverage.run]
branch = true
source = ["config", "app"]Esta configuracion permite definir la ruta de los tests, las carpetas que debe considerar el reporte de cobertura de codigo
Se debe ejecutar el siguiente comando
pytestSe debe ejecutar el siguiente comando
coverage run -m pytestSe debe ejecutar el siguiente comando
coverage reportSe debe ejecutar el siguiente comando
coverage htmlSe debe crear un archivo behave.ini con el siguiente contenido
[behave.formatters]
html = behave_html_formatter:HTMLFormatter
Esto nos permite definir el formato de salida de reporte de los tests de aceptación
Se debe ejecutar el siguiente comando
behave acceptance-test/features -f html -o behave-report.htmlEsta configuracion permite definir donde se encuentran los features, el formato html y el nombre del archivo del reporte
Al finalizar generara un reporte behave-report.html
Se debe crear un archivo con el nombre que deseemos, en este caso particular utilice el del mismo proyecto python-flask.py con el siguiente contenido
from locust import HttpUser, task, between
wait_time = between(1, 2)
class Product(HttpUser):
@task
def get_products(self):
self.client.get("/products")
@task
def get_product_by_sku(self):
self.client.get("/products/15207410")Como podemos ver definimos la tarea, la funcion y a que endpoint deseamos validar
Se debe ejecutar el siguiente comando
locust -f performance-test/locust/python-flask.py -H http://localhost:5000 -u 5 -r 10 -t 40 --headless --html locust-report.htmlAl finalizar generara un reporte locust-report.html
Para documentar los endpoints debemos hacerlo de forma manual mediante un archivo /static/swagger.yml
Para configurar Swagger UI simplemente agregamos el siguiente codigo al archivo init.py
swaggerui_blueprint = get_swaggerui_blueprint(Config.SWAGGER_URL, f'{Config.SWAGGER_FILE}')La variable SWAGGER_URL esta configurada con /swagger-ui y la variable SWAGGER_FILE con /static/swagger.yml
Cuando ejecutemos a la aplicacion debemos entrar a la pagina /swagger-ui/
A continuación dejo links utilizados para realizar este proyecto
Flask How To Make Validation On Request JSON
Change Host and Port Of Flask On Run
Performance Testing in Python: A Step-by-Step Guide with Locust