{"id":21289255,"url":"https://github.com/byron-villegas/python-flask","last_synced_at":"2026-05-20T19:35:26.091Z","repository":{"id":258097540,"uuid":"861496020","full_name":"byron-villegas/python-flask","owner":"byron-villegas","description":"Python + Flask + Json Web Token + Test Unitarios (pytest) + Test de Aceptación (behave) + Test de Rendimiento (locust)","archived":false,"fork":false,"pushed_at":"2026-02-08T00:57:50.000Z","size":90,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-08T09:28:14.756Z","etag":null,"topics":["behave","flask","jwt-authentication","locust","python","swagger"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/byron-villegas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-23T02:32:47.000Z","updated_at":"2026-02-08T00:57:54.000Z","dependencies_parsed_at":"2024-11-21T12:41:30.743Z","dependency_job_id":"41ac6e23-5df8-4197-97fa-06c7d420521d","html_url":"https://github.com/byron-villegas/python-flask","commit_stats":null,"previous_names":["byron-villegas/python-flask"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/byron-villegas/python-flask","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byron-villegas%2Fpython-flask","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byron-villegas%2Fpython-flask/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byron-villegas%2Fpython-flask/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byron-villegas%2Fpython-flask/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/byron-villegas","download_url":"https://codeload.github.com/byron-villegas/python-flask/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byron-villegas%2Fpython-flask/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33272499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T15:12:43.734Z","status":"ssl_error","status_checked_at":"2026-05-20T15:12:42.300Z","response_time":356,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["behave","flask","jwt-authentication","locust","python","swagger"],"created_at":"2024-11-21T12:37:47.785Z","updated_at":"2026-05-20T19:35:26.085Z","avatar_url":"https://github.com/byron-villegas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Python Flask\n\nProyecto base para aplicaciones Flask con ejemplos de configuración, testing y buenas prácticas.\n\n## Tabla de Contenidos\n\n- [Instalación](#instalación)\n- [Variables de Entorno](#variables-de-entorno)\n- [Ejecutar Aplicación](#ejecutar-aplicación)\n- [Testing](#testing)\n- [Tests de Aceptación](#tests-de-aceptación)\n- [Tests de Rendimiento](#tests-de-rendimiento)\n- [Swagger](#swagger)\n- [Links de Referencia](#links-de-referencia)\n\n## Instalación\n### Instalar Python\nPara instalar python debemos bajarlo e instalarlo de la siguiente pagina https://www.python.org/downloads/\n\n### Crear Entorno Virtual\nPara crear el entorno virtual debemos ejecutar el siguiente comando\n\n```shell\npython3 -m venv .venv\n```\n\n### Usar Envinronment\nSe debe ejecutar el siguiente comando\n\n```shell\nsource .venv/bin/activate\n```\n\n### Instalar Dependencias\nPara instalar las dependencias debemos ejecutar el siguiente comando\n\n```shell\npip install -r requirements.txt\n```\n\n#### Dependencias Exclusivas Windows\nCuando 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**\n\nEjemplo\n\n```txt\npywin32==306;sys_platform == 'win32'\n```\nEntonces cuando instalemos las dependencias del proyecto en un sistema operativo como linux, macOS excluira esa libreria\n\n### Actualizar Dependencias\nPara actualizar las dependencias en el archivo **requeriments.txt** debemos ejecutar el siguiente comando\n\n```shell\npip freeze \u003e requirements.txt\n```\n\n### Crear Archivo Dependencias Formato JSON\nPara crear el archivo de dependencias en formato JSON debemos ejecutar el siguiente comando\n\n```shell\npip list --format json \u003e requirements.json\n```\n\n### Listar Dependencias Formato JSON\nSe debe ejecutar el siguiente comando\n\n```shell\npip list --format json\n```\n\n## Variables de Entorno\nEste proyecto utiliza dotenv por lo que podemos crear el archivo **.env** con las siguientes variables\n\n```text\nSECRET_KEY=sasfdfsdsdf\nJWT_SECRET_KEY=sasfdfssas\n```\n\nEstas variables son las llaves secretas que se obtienen por variable de entorno, internamente las usa flask por defecto\n\n## Ejecutar Aplicación\nSe debe ejecutar el siguiente comando\n\n```shell\nflask --app app run\n```\n\n### Docker\nA continuacion dejo los comandos a utilizar para generar la imagen y posteriormente ejecutarla\n\n#### Imagen\nPara generar la imagen debemos utilizar el siguiente comando\n\n```shell\ndocker build -t python-flask .\n```\n\n#### Ejecutar\nPara ejecutar la imagen debemos utilizar el siguiente comando\n\n```shell\ndocker run -p 5000:5000 python-flask\n```\n\n## Testing\n### Configuración\nSe debe crear un archivo **pyproject.toml** con el siguiente contenido\n\n```python\n[tool.pytest.ini_options]\ntestpaths = [\"tests\"]\n\n[tool.coverage.run]\nbranch = true\nsource = [\"config\", \"app\"]\n```\n\nEsta configuracion permite definir la ruta de los tests, las carpetas que debe considerar el reporte de cobertura de codigo\n\n### Ejecutar\nSe debe ejecutar el siguiente comando\n\n```shell\npytest\n```\n\n### Ejecutar con Cobertura\nSe debe ejecutar el siguiente comando\n\n```shell\ncoverage run -m pytest\n```\n\n### Generar Reporte Cobertura Formato Consola\nSe debe ejecutar el siguiente comando\n\n```shell\ncoverage report\n```\n\n### Generar Reporte Cobertura Formato HTML\nSe debe ejecutar el siguiente comando\n\n```shell\ncoverage html\n```\n\n## Tests de Aceptación\n### Configuración\nSe debe crear un archivo **behave.ini** con el siguiente contenido\n\n```text\n[behave.formatters]\nhtml = behave_html_formatter:HTMLFormatter\n```\n\nEsto nos permite definir el formato de salida de reporte de los tests de aceptación\n\n### Ejecución\nSe debe ejecutar el siguiente comando\n\n```shell\nbehave acceptance-test/features -f html -o behave-report.html\n```\n\nEsta configuracion permite definir donde se encuentran los features, el formato html y el nombre del archivo del reporte\n\nAl finalizar generara un reporte **behave-report.html**\n\n## Tests de Rendimiento\n### Configuración\nSe 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\n\n```python\nfrom locust import HttpUser, task, between\n\nwait_time = between(1, 2)\n\nclass Product(HttpUser):\n    @task\n    def get_products(self):\n        self.client.get(\"/products\")\n    \n    @task\n    def get_product_by_sku(self):\n        self.client.get(\"/products/15207410\")\n```\nComo podemos ver definimos la tarea, la funcion y a que endpoint deseamos validar\n\n### Ejecución\nSe debe ejecutar el siguiente comando\n\n```shell\nlocust -f performance-test/locust/python-flask.py -H http://localhost:5000 -u 5 -r 10 -t 40 --headless --html locust-report.html\n```\n\nAl finalizar generara un reporte **locust-report.html**\n\n\n## Swagger\n### Documentar Modelos\nPara documentar los modelos debemos hacerlo mediante el archivo **swagger_schemas.py** \n\n### Documentar Endpoints\nDebemos documentarlo en los **routes.py** de respectivo a continuacion un ejemplo\n\n```python\n@bp.route(\"/products\", methods=[\"GET\"])\ndef get_products():\n    \"\"\"\n    Obtener todos los productos\n    ---\n    tags:\n      - Productos\n    responses:\n      200:\n        description: Lista de productos obtenida exitosamente\n        schema:\n          type: array\n          items:\n            $ref: '#/definitions/ProductDto'\n      500:\n        description: Error interno del servidor\n    \"\"\"\n    products = service.get_products()\n\n    return jsonify(products)\n```\n\n### Configurar Swagger UI\nPara configurar Swagger UI simplemente agregamos el siguiente codigo al archivo **__init__.py**\n\n```python\n    # Flasgger configuration\n    swagger_config = {\n        \"headers\": [],\n        \"specs\": [\n            {\n                \"endpoint\": \"apispec\",\n                \"route\": \"/apispec.json\",\n                \"rule_filter\": lambda rule: True,\n                \"model_filter\": lambda tag: True,\n            }\n        ],\n        \"static_url_path\": \"/flasgger_static\",\n        \"swagger_ui\": True,\n        \"specs_route\": \"/swagger-ui\"\n    }\n    \n    # Importar esquemas de Pydantic después de crear la app\n    from app.swagger_schemas import get_swagger_definitions\n    \n    swagger_template = {\n        \"swagger\": \"2.0\",\n        \"info\": {\n            \"title\": \"Python Flask API\",\n            \"description\": \"API REST con Flask, JWT y documentación automática con DTOs de Pydantic\",\n            \"version\": \"1.0.0\",\n            \"contact\": {\n                \"name\": \"API Support\",\n            }\n        },\n        \"securityDefinitions\": {\n            \"Bearer\": {\n                \"type\": \"apiKey\",\n                \"name\": \"Authorization\",\n                \"in\": \"header\",\n                \"description\": \"JWT Authorization header usando el esquema Bearer. Ejemplo: 'Bearer {token}'\"\n            }\n        },\n        \"security\": [\n            {\n                \"Bearer\": []\n            }\n        ],\n        \"definitions\": get_swagger_definitions()\n    }\n    \n    Swagger(app, config=swagger_config, template=swagger_template)\n```\n\nCuando ejecutemos a la aplicacion debemos entrar a la pagina **/swagger-ui/**\n\n## Links de Referencia\nA continuación dejo links utilizados para realizar este proyecto\n\n[Python Naming Conventions](https://www.geeksforgeeks.org/python-naming-conventions/)\n\n[Configuring Your Flask App](https://dev.to/hackersandslackers/configuring-your-flask-app-2246)\n\n[Flask How To Make Validation On Request JSON](https://stackoverflow.com/questions/61644396/flask-how-to-make-validation-on-request-json-and-json-schema)\n\n[Change Host and Port Of Flask On Run](https://stackoverflow.com/questions/41940663/how-can-i-change-the-host-and-port-that-the-flask-command-uses)\n\n[Performance Testing in Python: A Step-by-Step Guide with Locust](https://code.likeagirl.io/performance-testing-in-python-a-step-by-step-guide-with-flask-e5a56f99513d)\n\n[How To Run Locust](https://appian-locust.readthedocs.io/en/stable/how_to_run_locust.html)\n\n[Behave](https://behave.readthedocs.io/en/latest/tutorial/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyron-villegas%2Fpython-flask","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbyron-villegas%2Fpython-flask","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyron-villegas%2Fpython-flask/lists"}