{"id":20294821,"url":"https://github.com/hackademymx/tutorial-flask","last_synced_at":"2026-02-12T20:02:10.859Z","repository":{"id":262513522,"uuid":"887460508","full_name":"hackademymx/tutorial-flask","owner":"hackademymx","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-12T20:02:22.000Z","size":4,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-09-08T20:33:57.056Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hackademymx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-11-12T19:30:49.000Z","updated_at":"2024-11-12T20:02:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"6726a47f-bb2f-403f-bdb2-112cd5094782","html_url":"https://github.com/hackademymx/tutorial-flask","commit_stats":null,"previous_names":["hackademymx/tutorial-flask"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hackademymx/tutorial-flask","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackademymx%2Ftutorial-flask","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackademymx%2Ftutorial-flask/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackademymx%2Ftutorial-flask/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackademymx%2Ftutorial-flask/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hackademymx","download_url":"https://codeload.github.com/hackademymx/tutorial-flask/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackademymx%2Ftutorial-flask/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29379674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T19:05:20.189Z","status":"ssl_error","status_checked_at":"2026-02-12T19:01:44.216Z","response_time":55,"last_error":"SSL_read: 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":[],"created_at":"2024-11-14T15:31:21.643Z","updated_at":"2026-02-12T20:02:10.837Z","avatar_url":"https://github.com/hackademymx.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# tutorial flask\n\n## ¿Qué es Flask?\nFlask Python es un sencillo framework web, idóneo tanto para principiantes como para profesionales. Flask incluye únicamente lo esencial, pero los usuarios pueden implementar bibliotecas externas para ampliar sus funcionalidades.\n\n## 1.- Iniciar un proyecto y su configuración\n\n* Crea la carpeta del proyecto, esto lo puedes hacer desde el navegador de archivos de tu computadora o desde la línea de comando.\n* Abre la carpeta con VS Code\n* Abre la terminal en VS Code\n* Instala e inicializa el entorno virtual\n```\nvirtualenv venv\n```\n```\nsource venv/bin/activate\n```\n* Ahora vamos a instalar los paquetes necesarios:\n  * Instalamos Flask\n  * Instalamos psycopg2-binary que nos permitirá conectarnos con el servidor de la base de datos\n  * Instalamos Flask-SQLAlchemy que es el ORM con el que vamos a interactuar con la base de datos\n  * Instalamos Flask-Mail que nos permitirá enviar correos\n  * Instalamos flask_cors que nos permitirá trabajar con los HEADERS y CORS\n  * Instalamos PyJWT que nos permitirá trabajar con tokes y autenticación\n  * Instalamos dotenv que nos permitirá trabajar con variables de entorno\n```\npip install Flask psycopg2-binary Flask-SQLAlchemy Flask-Mail flask_cors PyJWT\n```\n\n## 2.- Estructura del proyecto\nOrganiza tu proyecto con esta estructura básica\n\n```\nmy_flask_app/\n├── app.py           # Archivo principal de la aplicación\n├── config.py        # Configuración de la app (base de datos, correo)\n├── models.py        # Definición de los modelos de la base de datos\n├── .env\n└── requirements.txt # Dependencias del proyecto\n```\n\n## 3.- Configuración de la aplicación y base de datos\nPara trabajar con la base de datos necesitas crear una cuenta en [neon.tech](https://neon.tech) y ahí crear una base de datos gratuita, te dará el comando completo que deberás copiar y agregar en tu archivo ```.env```\n\n```\n# config.py\nfrom dotenv import load_dotenv #Importamos el paquete dotenv\nimport os\nload_dotenv() # Cargamos el archivo con las variables de entorno y vamos a usar os.getenv('nombre_variable') para acceder al dato\n\nclass Config:\n    SECRET_KEY = os.getenv('SECRET_KEY') # os.environ.get('SECRET_KEY') or 'una_llave_secreta'\n    SQLALCHEMY_DATABASE_URI = os.getenv('BBDD_URL') # os.environ.get('BBDD_URL')\n    SQLALCHEMY_TRACK_MODIFICATIONS = False\n    JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY') #or 'una_llave_secreta_para_jwt'  # Nueva clave para JWT\n\n    # Configuración para enviar correo\n    MAIL_SERVER = 'smtp.dreamhost.com'\n    MAIL_PORT = 587\n    MAIL_USE_TLS = True\n    MAIL_USERNAME =  os.getenv('EMAIL_USER')  # Añade tu email #'fernando@hackademy.mx' \n    MAIL_PASSWORD =  os.getenv('EMAIL_PASS')  # Añade tu password #'2yZtrUQK'\n```\nEn nuestro archivo ```.env``` vamos a guardar los datos de nuestras variables:\n```\nEMAIL_USER=dirección de correo de la que mandaremos mails\nEMAIL_PASS=contraseña del correo\nJWT_SECRET_KEY=en gogle hay generadores de secrets para JWT\nBBDD_URL='el comando que te da neon'\n```\n\n## 4.- Nuestro primer modelo en ```models.py```\nEn el archivo ```models.py``` importamos SQLAlquemy que será nuestro ORM, con esto podemos trabajar con la base de datos a traves de clases.\nNuestro primer modelo será el de usuarios.\n```\n# models.py\nfrom flask_sqlalchemy import SQLAlchemy\n\ndb = SQLAlchemy()\n\nclass User(db.Model):\n    __tablename__ = 'users'\n    \n    id = db.Column(db.Integer, primary_key=True)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n    password = db.Column(db.String(60), nullable=False)\n    otp = db.Column(db.String(6), nullable=True)\n    is_verified = db.Column(db.Boolean, default=False)\n```\n\n## 5.- Crear aplicación\nVamos a crear nuestra aplicación, para esto deberemos de modificar el archivo ```app.py```\n\n```\n# app.py\nfrom flask import Flask\nfrom config import Config\nfrom models import db\nimport random\nfrom flask import request, jsonify\nfrom models import User\nfrom flask_mail import Mail, Message\n\napp = Flask(__name__)\napp.config.from_object(Config)\ndb.init_app(app)\n\nwith app.app_context():\n    db.create_all()\n```\n## 6.- Mi primer EndPoint\nAhora vamos a desarrollar la primer funcionalidad de nuestro proyecto, un EP que nos permita registrar usuarias en nuestra base de datos, para esto vamos a agregar código despues del método ```db.create_all()``. Recuerda que para python lo importante es la identación así que nuestro código, del EP, debe de empezar al inicio de la línea.\n\n```\nmail = Mail(app)\n\ndef generate_otp():\n    return str(random.randint(100000, 999999))\n\n@app.route('/register', methods=['POST'])\ndef register():\n    data = request.get_json()\n    email = data.get('email')\n    password = data.get('password')\n\n    # Verifica si el usuario ya existe\n    if User.query.filter_by(email=email).first():\n        return jsonify({'message': 'El usuario ya existe.'}), 400\n\n    # Crea el usuario con OTP\n    otp = generate_otp()\n    new_user = User(email=email, password=password, otp=otp)\n    db.session.add(new_user)\n    db.session.commit()\n\n    # Envía el correo electrónico con OTP\n    msg = Message('Verificación de tu cuenta', sender=app.config['MAIL_USERNAME'], recipients=[email])\n    msg.body = f'Tu OTP es: {otp}'\n    mail.send(msg)\n\n    return jsonify({'message': 'Usuario registrado. Revisa tu correo para la verificación.'}), 201\n```\nEste endpoint:\n\n* Recibe el correo electrónico y la contraseña del usuario.\n* Verifica si el correo ya está registrado.\n* Genera un OTP y lo envía por correo.\n* Devuelve un mensaje de confirmación.\n\nCon esto ya tienes una estructura básica para el registro. En el próximo paso, agregaremos la lógica para que el usuario valide su OTP y active su cuenta.\n\n## 7.- Ejecutar mi proyecto\nPara correr tu proyecto y hacer pruebas necesitas ejecutar, en la terminal de VS Code, el siguiente comando ```python -m flask run ``` con esto tu proyecto estará corriendo.\nLa terminal te dará una url tipo ```127.0.0.1:5000``` que es donde está corriendo tu proyecto, deberás abrir Postman y configurar un EP POST para pasarle una URL tipo ```127.0.0.1:5000/register```.\n\nEn Postman debes de configurar para el el body sea ```raw``` y ```json```, para pasar un json con esta estructura:\n```\n{\n    \"email\":\"\",\n    \"password\":\"\",\n    \"date_birth\":\"\"\n}\n```\n\n## Y listo, tendrás tu primer proyecto.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhackademymx%2Ftutorial-flask","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhackademymx%2Ftutorial-flask","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhackademymx%2Ftutorial-flask/lists"}