Skip to content

Python + Flask + Json Web Token + Test Unitarios (pytest) + Test de Aceptación (behave) + Test de Rendimiento (locust)

License

Notifications You must be signed in to change notification settings

byron-villegas/python-flask

Repository files navigation

Python Flask

Proyecto base para aplicaciones Flask con ejemplos de configuración, testing y buenas prácticas.

Tabla de Contenidos

Instalación

Instalar Python

Para instalar python debemos bajarlo e instalarlo de la siguiente pagina https://www.python.org/downloads/

Crear Entorno Virtual

Para crear el entorno virtual debemos ejecutar el siguiente comando

python3 -m venv .venv

Usar Envinronment

Se debe ejecutar el siguiente comando

source .venv/bin/activate

Instalar Dependencias

Para instalar las dependencias debemos ejecutar el siguiente comando

pip install -r requirements.txt

Dependencias Exclusivas Windows

Cuando 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

Actualizar Dependencias

Para actualizar las dependencias en el archivo requeriments.txt debemos ejecutar el siguiente comando

pip freeze > requirements.txt

Crear Archivo Dependencias Formato JSON

Para crear el archivo de dependencias en formato JSON debemos ejecutar el siguiente comando

pip list --format json > requirements.json

Listar Dependencias Formato JSON

Se debe ejecutar el siguiente comando

pip list --format json

Variables de Entorno

Este 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

Ejecutar Aplicación

Se debe ejecutar el siguiente comando

flask --app app run

Docker

A continuacion dejo los comandos a utilizar para generar la imagen y posteriormente ejecutarla

Imagen

Para generar la imagen debemos utilizar el siguiente comando

docker build -t python-flask .

Ejecutar

Para ejecutar la imagen debemos utilizar el siguiente comando

docker run -p 5000:5000 python-flask

Testing

Configuración

Se 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

Ejecutar

Se debe ejecutar el siguiente comando

pytest

Ejecutar con Cobertura

Se debe ejecutar el siguiente comando

coverage run -m pytest

Generar Reporte Cobertura Formato Consola

Se debe ejecutar el siguiente comando

coverage report

Generar Reporte Cobertura Formato HTML

Se debe ejecutar el siguiente comando

coverage html

Tests de Aceptación

Configuración

Se 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

Ejecución

Se debe ejecutar el siguiente comando

behave acceptance-test/features -f html -o behave-report.html

Esta 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

Tests de Rendimiento

Configuración

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

Ejecución

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.html

Al finalizar generara un reporte locust-report.html

Swagger

Documentar Modelos

Para documentar los modelos debemos hacerlo mediante el archivo swagger_schemas.py

Documentar Endpoints

Debemos documentarlo en los routes.py de respectivo a continuacion un ejemplo

@bp.route("/products", methods=["GET"])
def get_products():
    """
    Obtener todos los productos
    ---
    tags:
      - Productos
    responses:
      200:
        description: Lista de productos obtenida exitosamente
        schema:
          type: array
          items:
            $ref: '#/definitions/ProductDto'
      500:
        description: Error interno del servidor
    """
    products = service.get_products()

    return jsonify(products)

Configurar Swagger UI

Para configurar Swagger UI simplemente agregamos el siguiente codigo al archivo init.py

    # Flasgger configuration
    swagger_config = {
        "headers": [],
        "specs": [
            {
                "endpoint": "apispec",
                "route": "/apispec.json",
                "rule_filter": lambda rule: True,
                "model_filter": lambda tag: True,
            }
        ],
        "static_url_path": "/flasgger_static",
        "swagger_ui": True,
        "specs_route": "/swagger-ui"
    }
    
    # Importar esquemas de Pydantic después de crear la app
    from app.swagger_schemas import get_swagger_definitions
    
    swagger_template = {
        "swagger": "2.0",
        "info": {
            "title": "Python Flask API",
            "description": "API REST con Flask, JWT y documentación automática con DTOs de Pydantic",
            "version": "1.0.0",
            "contact": {
                "name": "API Support",
            }
        },
        "securityDefinitions": {
            "Bearer": {
                "type": "apiKey",
                "name": "Authorization",
                "in": "header",
                "description": "JWT Authorization header usando el esquema Bearer. Ejemplo: 'Bearer {token}'"
            }
        },
        "security": [
            {
                "Bearer": []
            }
        ],
        "definitions": get_swagger_definitions()
    }
    
    Swagger(app, config=swagger_config, template=swagger_template)

Cuando ejecutemos a la aplicacion debemos entrar a la pagina /swagger-ui/

Links de Referencia

A continuación dejo links utilizados para realizar este proyecto

Python Naming Conventions

Configuring Your Flask App

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

How To Run Locust

Behave

About

Python + Flask + Json Web Token + Test Unitarios (pytest) + Test de Aceptación (behave) + Test de Rendimiento (locust)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published