From c625befdf0914ff6396da8ff32379f064a1b4ac2 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Wed, 28 Dec 2022 23:44:03 +0100
Subject: [PATCH 01/28] =?UTF-8?q?Backend:=20D=C3=ADa=206?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../FastAPI/__pycache__/main.cpython-310.pyc  | Bin 868 -> 868 bytes
 .../db/__pycache__/client.cpython-310.pyc     | Bin 242 -> 343 bytes
 Backend/FastAPI/db/client.py                  |  15 +++-
 .../models/__pycache__/user.cpython-310.pyc   | Bin 459 -> 503 bytes
 Backend/FastAPI/db/models/user.py             |   3 +-
 .../schemas/__pycache__/user.cpython-310.pyc  | Bin 658 -> 658 bytes
 Backend/FastAPI/requirements.txt              |   7 ++
 .../basic_auth_users.cpython-310.pyc          | Bin 2377 -> 2497 bytes
 .../jwt_auth_users.cpython-310.pyc            | Bin 3215 -> 3031 bytes
 .../__pycache__/users_db.cpython-310.pyc      | Bin 2371 -> 2328 bytes
 Backend/FastAPI/routers/basic_auth_users.py   |   4 +-
 Backend/FastAPI/routers/jwt_auth_users.py     |   5 +-
 Backend/FastAPI/routers/users_db.py           |  12 +--
 README.md                                     |  71 ++++++------------
 14 files changed, 57 insertions(+), 60 deletions(-)
 create mode 100644 Backend/FastAPI/requirements.txt

diff --git a/Backend/FastAPI/__pycache__/main.cpython-310.pyc b/Backend/FastAPI/__pycache__/main.cpython-310.pyc
index a6b2a3a3300f5be2cacd56acfe46ddd6587c2d39..f442d8fffb04f39d615829a04796a2a65ce8a8f1 100644
GIT binary patch
diff --git a/Backend/FastAPI/db/__pycache__/client.cpython-310.pyc b/Backend/FastAPI/db/__pycache__/client.cpython-310.pyc
index 23a66f178b81dc726669efdb418fb32d588af6ce..47b6b88ecf0977ffcf54b11efc2cdd610e3687ea 100644
GIT binary patch
diff --git a/Backend/FastAPI/db/client.py b/Backend/FastAPI/db/client.py
index 498e15f..ce3e434 100644
--- a/Backend/FastAPI/db/client.py
+++ b/Backend/FastAPI/db/client.py
@@ -10,4 +10,17 @@
 
 from pymongo import MongoClient
 
-db_client = MongoClient()
+# Descomentar el db_client local o remoto correspondiente
+
+# Base de datos local MongoDB
+db_client = MongoClient().local
+
+# Clase en vídeo (28/12/2022): https://www.twitch.tv/videos/1691208894
+
+# Base de datos remota MongoDB Atlas (https://mongodb.com)
+# db_client = MongoClient(
+#     "mongodb+srv://<user>:<password>@<url>/?retryWrites=true&w=majority").test
+
+# Despliegue API en la nube:
+# Deta - https://www.deta.sh/
+# Intrucciones - https://fastapi.tiangolo.com/deployment/deta/
diff --git a/Backend/FastAPI/db/models/__pycache__/user.cpython-310.pyc b/Backend/FastAPI/db/models/__pycache__/user.cpython-310.pyc
index 22edbcd141162bbc29058ddce498ac1b03199309..9856464391a7fdbb084a2d5811c947b092d9e3f6 100644
GIT binary patch
diff --git a/Backend/FastAPI/db/models/user.py b/Backend/FastAPI/db/models/user.py
index 75446ad..c7b03c6 100644
--- a/Backend/FastAPI/db/models/user.py
+++ b/Backend/FastAPI/db/models/user.py
@@ -3,9 +3,10 @@
 ### User model ###
 
 from pydantic import BaseModel
+from typing import Optional
 
 
 class User(BaseModel):
-    id: str | None
+    id: Optional[str]
     username: str
     email: str
diff --git a/Backend/FastAPI/db/schemas/__pycache__/user.cpython-310.pyc b/Backend/FastAPI/db/schemas/__pycache__/user.cpython-310.pyc
index 9137a545d9fd0321088e5a845ca6c784e1cb9bbd..baa6747bef90499bd68e54f52dd878ddc81834ac 100644
GIT binary patch
diff --git a/Backend/FastAPI/requirements.txt b/Backend/FastAPI/requirements.txt
new file mode 100644
index 0000000..802985d
--- /dev/null
+++ b/Backend/FastAPI/requirements.txt
@@ -0,0 +1,7 @@
+# Clase en vídeo (28/12/2022): https://www.twitch.tv/videos/1691208894
+fastapi
+python-jose
+passlib
+bcrypt
+pymongo
+python-multipart
\ No newline at end of file
diff --git a/Backend/FastAPI/routers/__pycache__/basic_auth_users.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/basic_auth_users.cpython-310.pyc
index 3f26ee264d4ec291f6e32025df31edb8264afa14..45827c6a92f95a5308d5ba2a80ef40b23a225314 100644
GIT binary patch
diff --git a/Backend/FastAPI/routers/__pycache__/jwt_auth_users.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/jwt_auth_users.cpython-310.pyc
index 2ffc14acb49210eeb55964e9d08ca7a9d138abe9..d2df27746760cd7abc73bdab7a266200df4094e5 100644
GIT binary patch
diff --git a/Backend/FastAPI/routers/__pycache__/users_db.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/users_db.cpython-310.pyc
index 51e770726c4fe626ff117f31eaa18a38e4f0251d..2e252011684979444ac06f7f3bd991a81d1a1c91 100644
GIT binary patch
diff --git a/Backend/FastAPI/routers/basic_auth_users.py b/Backend/FastAPI/routers/basic_auth_users.py
index ad4562a..73d7eba 100644
--- a/Backend/FastAPI/routers/basic_auth_users.py
+++ b/Backend/FastAPI/routers/basic_auth_users.py
@@ -6,7 +6,9 @@
 from pydantic import BaseModel
 from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
 
-router = APIRouter()
+router = APIRouter(prefix="/basicauth",
+                   tags=["basicauth"],
+                   responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}})
 
 oauth2 = OAuth2PasswordBearer(tokenUrl="login")
 
diff --git a/Backend/FastAPI/routers/jwt_auth_users.py b/Backend/FastAPI/routers/jwt_auth_users.py
index 5a59972..3c04002 100644
--- a/Backend/FastAPI/routers/jwt_auth_users.py
+++ b/Backend/FastAPI/routers/jwt_auth_users.py
@@ -13,7 +13,9 @@
 ACCESS_TOKEN_DURATION = 1
 SECRET = "201d573bd7d1344d3a3bfce1550b69102fd11be3db6d379508b6cccc58ea230b"
 
-router = APIRouter()
+router = APIRouter(prefix="/jwtauth",
+                   tags=["jwtauth"],
+                   responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}})
 
 oauth2 = OAuth2PasswordBearer(tokenUrl="login")
 
@@ -88,6 +90,7 @@ async def current_user(user: User = Depends(auth_user)):
 
 @router.post("/login")
 async def login(form: OAuth2PasswordRequestForm = Depends()):
+
     user_db = users_db.get(form.username)
     if not user_db:
         raise HTTPException(
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index ce19817..270440d 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -15,7 +15,7 @@
 
 @router.get("/", response_model=list[User])
 async def users():
-    return users_schema(db_client.local.users.find())
+    return users_schema(db_client.users.find())
 
 
 @router.get("/{id}")  # Path
@@ -37,9 +37,9 @@ async def user(user: User):
     user_dict = dict(user)
     del user_dict["id"]
 
-    id = db_client.local.users.insert_one(user_dict).inserted_id
+    id = db_client.users.insert_one(user_dict).inserted_id
 
-    new_user = user_schema(db_client.local.users.find_one({"_id": id}))
+    new_user = user_schema(db_client.users.find_one({"_id": id}))
 
     return User(**new_user)
 
@@ -51,7 +51,7 @@ async def user(user: User):
     del user_dict["id"]
 
     try:
-        db_client.local.users.find_one_and_replace(
+        db_client.users.find_one_and_replace(
             {"_id": ObjectId(user.id)}, user_dict)
     except:
         return {"error": "No se ha actualizado el usuario"}
@@ -62,7 +62,7 @@ async def user(user: User):
 @router.delete("/{id}", status_code=status.HTTP_204_NO_CONTENT)
 async def user(id: str):
 
-    found = db_client.local.users.find_one_and_delete({"_id": ObjectId(id)})
+    found = db_client.users.find_one_and_delete({"_id": ObjectId(id)})
 
     if not found:
         return {"error": "No se ha eliminado el usuario"}
@@ -73,7 +73,7 @@ async def user(id: str):
 def search_user(field: str, key):
 
     try:
-        user = db_client.local.users.find_one({field: key})
+        user = db_client.users.find_one({field: key})
         return User(**user_schema(user))
     except:
         return {"error": "No se ha encontrado el usuario"}
diff --git a/README.md b/README.md
index 64a56f5..3e8417e 100644
--- a/README.md
+++ b/README.md
@@ -9,39 +9,11 @@
 ![](./Images/header.jpg)
 
 ### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
+> ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
 
 
-
-### 🐍 CADA SEMANA UNA NUEVA CLASE EN DIRECTO 🐍
-##### Si consideras útil esta actividad, apóyala haciendo "★ Star" en el repositorio. ¡Gracias!
-
-> ---
-> Estoy llevando a cabo un CURSO DESDE CERO gratis para aprender PYTHON en BACKEND.
-> 
-> **🔴 SIGUIENTE CLASE: Miércoles 28 de Diciembre a las 20:00 (hora España)**
-
-> 🗓 En [Discord](https://discord.gg/mouredev) tienes creado un [evento](https://discord.gg/mouredev?event=1055759221637009508) para que consultes la hora de tu país y añadas un recordatorio.
-> 
-> Mientras, aprovecha para practicar unos [retos de programación](https://retosdeprogramacion.com/semanales2022) y así ir mejorando poco a poco.
-> 
-> *Finalizada la clase, se actualizará el repositorio con los nuevos recursos*
-> 
-> ---
-
 ## Clases en vídeo
 
-### [EN CURSO] Backend desde cero
-
-Curso en el que aprenderemos a utilizar Python para backend e implementaremos un API REST con autenticación, base de datos y desplegaremos el proyecto en un servidor real.
-
-> Código: Directorio "Backend" en el proyecto
-
-* [Clase 1 - 24/11/2022 - Hola Mundo en FastAPI](https://www.twitch.tv/videos/1661716599)
-* [Clase 2 - 01/12/2022 - Operaciones con GET y peticiones HTTP](https://www.twitch.tv/videos/1667582141)
-* [Clase 3 - 08/12/2022 - Operaciones con POST, PUT, DELETE, códigos HTTP y Routers](https://www.twitch.tv/videos/1673759045)
-* [Clase 4 - 14/12/2022 - Recursos estáticos y Autorización OAuth2](https://www.twitch.tv/videos/1679022882) 
-* [Clase 5 - 22/12/2022 - Base de datos con MongoDB](https://www.twitch.tv/videos/1686104006) 
-
 ### Curso de fundamentos desde cero
 
 Curso que agrupa todas las clases en directo que hacen referencia a los fundamentos de Python.
@@ -89,42 +61,41 @@ Curso en el que continuamos aprendiendo Python desde sus bases, siguiendo la rut
 * [Lección 9 - Manejo de paquetes](https://youtu.be/TbcEqkabAWU?t=24010)
 * [Próximos pasos](https://youtu.be/TbcEqkabAWU?t=26228)
 
-## Información importante y preguntas frecuentes
+### Backend desde cero
 
-* **¿Cómo está estructurado el proyecto y el código?**
-	* Actualmente tienes tres directorios, "Basic", "Intermediate" y "Backend", correspondientes a cómo están agrupados los cursos.
+Curso en el que aprenderemos a utilizar Python para backend e implementaremos un API REST con autenticación, base de datos y desplegaremos el proyecto en un servidor real.
 
-* **¿Las clases nuevas quedan grabadas?**
-	* Todos los directos de Twitch están disponibles 60 días en la sección [vídeos](https://twitch.tv/mouredev/videos).
+> Código: Directorio "Backend" en el proyecto
 
-* **¿Puedo asistir a las clases en directo si no he visto las anteriores?**
-	* Sí. Son clases independientes en las que hablo de nuevo de conceptos anteriores para que se entiendan de nuevo. Por supuesto, es recomendable que poco a poco visualices las clases anteriores.
+* [Clase 1 - 24/11/2022 - Hola Mundo en FastAPI](https://www.twitch.tv/videos/1661716599)
+* [Clase 2 - 01/12/2022 - Operaciones con GET y peticiones HTTP](https://www.twitch.tv/videos/1667582141)
+* [Clase 3 - 08/12/2022 - Operaciones con POST, PUT, DELETE, códigos HTTP y Routers](https://www.twitch.tv/videos/1673759045)
+* [Clase 4 - 14/12/2022 - Recursos estáticos y Autorización OAuth2](https://www.twitch.tv/videos/1679022882) 
+* [Clase 5 - 22/12/2022 - Base de datos con MongoDB](https://www.twitch.tv/videos/1686104006) 
+* [Clase 6 - 28/12/2022 - Despliegue en la nube usando MongoDB Atrlas y Deta](https://www.twitch.tv/videos/1691208894)
 
-* **¿Se subirá a YouTube?**
-	* No te preocupes, antes de que se cumplan los 60 días de Twitch, iré publicando las clases agrupadas en YouTube.
+**Muy pronto curso editado en YouTube...**
 
-* **¿Harás un curso?**
-	* Agruparé lecciones en YouTube para crear cursos por nivel. Actualmente ya existe el de [fundamentos desde cero](https://youtu.be/Kp4Mvapo5kc) e [intermedio](https://youtu.be/TbcEqkabAWU).
+## Información importante y preguntas frecuentes
+
+Actualmente el curso está en pausa. Se han finalizados los bloques básico, intermedio y backend, y ese era el objetivo inicial del proyecto.
+No descarto añadir nuevas lecciones a futuro, pero creo que por el momento puede servir de base a cualquier persona que quiera empezar a aprender este lenguaje.
 
-* **¿Hasta dónde llegará el curso?**
-	* Mi idea es repasar los conceptos básicos hasta llegar a crear un backend (en principio).
+* Recuerda que he creado en el [Discord](https://discord.gg/mouredev) un canal "🐍python" para que puedas comentar lo que quieras.
+* En el momento que el curso continúe, actualizaré el repositorio y avisaré en redes.
 
-* **¿Cuándo será la próxima clase?**
-	* Te recomiendo que me sigas en redes, sobre todo en [Discord](https://discord.gg/mouredev) e [Instagram](https://instagram.com/mouredev) donde creo eventos a diario con la hora de emisión (así podrás ver qué hora es en tu país).
-	* También he creado en el Discord un canal "🐍curso-python" para que puedas comentar lo que quieras.
-	* Una vez finalizada la clase subiré los ficheros de código a este repositorio.
+¡Muchísimas gracias por todo el apoyo mostrado!
 
----
+## Enlaces de interés
 
-### Enlaces de interés
 * [Web oficial de Python](https://www.python.org/)
 * [Tutorial oficial de Python en Español](https://docs.python.org/es/3/tutorial/index.html)
 * [Repo 30 días de Python](https://github.com/Asabeneh/30-Days-Of-Python)
 * [Juego Codédex para aprender Python](https://www.codedex.io/)
 * [Visual Studio Code](https://code.visualstudio.com/): El editor que estoy usando
 * [FastAPI](https://fastapi.tiangolo.com/es/): El framework para crear nuestra API Backend
-
----
+* [MongoDB](https://www.mongodb.com/): La base de datos que utiliza nuestro backend
+* [Deta](https://www.deta.sh/): Para desplegar nuestra API en la nube
 
 #### Puedes apoyar mi trabajo haciendo "☆ Star" en el repo o nominarme a "GitHub Star". ¡Gracias!
 

From fcfc58b7452edc4364010cd109db6e3628466da3 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Thu, 5 Jan 2023 19:37:53 +0100
Subject: [PATCH 02/28] Curso de Python desde cero en YouTube [Backend]

---
 .gitignore                                    |   2 ++
 .../FastAPI/__pycache__/main.cpython-310.pyc  | Bin 868 -> 0 bytes
 .../__pycache__/products.cpython-310.pyc      | Bin 432 -> 0 bytes
 .../FastAPI/__pycache__/users.cpython-310.pyc | Bin 2579 -> 0 bytes
 .../db/__pycache__/client.cpython-310.pyc     | Bin 343 -> 0 bytes
 Backend/FastAPI/db/client.py                  |   4 +--
 .../models/__pycache__/user.cpython-310.pyc   | Bin 503 -> 0 bytes
 Backend/FastAPI/db/models/user.py             |   2 +-
 .../schemas/__pycache__/user.cpython-310.pyc  | Bin 658 -> 0 bytes
 Backend/FastAPI/main.py                       |  12 ++++---
 Backend/FastAPI/requirements.txt              |   2 +-
 .../basic_auth_users.cpython-310.pyc          | Bin 2497 -> 0 bytes
 .../jwt_auth_users.cpython-310.pyc            | Bin 3031 -> 0 bytes
 .../__pycache__/products.cpython-310.pyc      | Bin 685 -> 0 bytes
 .../routers/__pycache__/users.cpython-310.pyc | Bin 2592 -> 0 bytes
 .../__pycache__/users_db.cpython-310.pyc      | Bin 2328 -> 0 bytes
 Backend/FastAPI/routers/basic_auth_users.py   |   2 +-
 Backend/FastAPI/routers/jwt_auth_users.py     |   2 +-
 Backend/FastAPI/routers/products.py           |   2 +-
 Backend/FastAPI/routers/users.py              |   4 +--
 Backend/FastAPI/routers/users_db.py           |   2 +-
 Backend/type_hints.py                         |   2 +-
 Images/header.jpg                             | Bin 275706 -> 253557 bytes
 .../__pycache__/__init__.cpython-310.pyc      | Bin 184 -> 0 bytes
 .../__pycache__/arithmetics.cpython-310.pyc   | Bin 319 -> 0 bytes
 README.md                                     |  31 +++++++++++++-----
 __pycache__/module.cpython-310.pyc            | Bin 310 -> 0 bytes
 __pycache__/my_module.cpython-310.pyc         | Bin 431 -> 0 bytes
 28 files changed, 43 insertions(+), 24 deletions(-)
 create mode 100644 .gitignore
 delete mode 100644 Backend/FastAPI/__pycache__/main.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/__pycache__/products.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/__pycache__/users.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/db/__pycache__/client.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/db/models/__pycache__/user.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/db/schemas/__pycache__/user.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/routers/__pycache__/basic_auth_users.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/routers/__pycache__/jwt_auth_users.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/routers/__pycache__/products.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/routers/__pycache__/users.cpython-310.pyc
 delete mode 100644 Backend/FastAPI/routers/__pycache__/users_db.cpython-310.pyc
 delete mode 100644 Intermediate/mypackage/__pycache__/__init__.cpython-310.pyc
 delete mode 100644 Intermediate/mypackage/__pycache__/arithmetics.cpython-310.pyc
 delete mode 100644 __pycache__/module.cpython-310.pyc
 delete mode 100644 __pycache__/my_module.cpython-310.pyc

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..029519e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+__pycache__/
+*.py[cod]
\ No newline at end of file
diff --git a/Backend/FastAPI/__pycache__/main.cpython-310.pyc b/Backend/FastAPI/__pycache__/main.cpython-310.pyc
deleted file mode 100644
index f442d8fffb04f39d615829a04796a2a65ce8a8f1..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/__pycache__/products.cpython-310.pyc b/Backend/FastAPI/__pycache__/products.cpython-310.pyc
deleted file mode 100644
index 3dc8d32d378beb9497422a11b97d9979f6597eb4..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/__pycache__/users.cpython-310.pyc b/Backend/FastAPI/__pycache__/users.cpython-310.pyc
deleted file mode 100644
index 0d94f03f92979fa66827d397520a6359984a3698..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/db/__pycache__/client.cpython-310.pyc b/Backend/FastAPI/db/__pycache__/client.cpython-310.pyc
deleted file mode 100644
index 47b6b88ecf0977ffcf54b11efc2cdd610e3687ea..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/db/client.py b/Backend/FastAPI/db/client.py
index ce3e434..bfccb67 100644
--- a/Backend/FastAPI/db/client.py
+++ b/Backend/FastAPI/db/client.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (22/12/2022): https://www.twitch.tv/videos/1686104006
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=20480)
 
 ### MongoDB client ###
 
@@ -15,7 +15,7 @@
 # Base de datos local MongoDB
 db_client = MongoClient().local
 
-# Clase en vídeo (28/12/2022): https://www.twitch.tv/videos/1691208894
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=25470
 
 # Base de datos remota MongoDB Atlas (https://mongodb.com)
 # db_client = MongoClient(
diff --git a/Backend/FastAPI/db/models/__pycache__/user.cpython-310.pyc b/Backend/FastAPI/db/models/__pycache__/user.cpython-310.pyc
deleted file mode 100644
index 9856464391a7fdbb084a2d5811c947b092d9e3f6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/db/models/user.py b/Backend/FastAPI/db/models/user.py
index c7b03c6..b26dc09 100644
--- a/Backend/FastAPI/db/models/user.py
+++ b/Backend/FastAPI/db/models/user.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (22/12/2022): https://www.twitch.tv/videos/1686104006
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=20480
 
 ### User model ###
 
diff --git a/Backend/FastAPI/db/schemas/__pycache__/user.cpython-310.pyc b/Backend/FastAPI/db/schemas/__pycache__/user.cpython-310.pyc
deleted file mode 100644
index baa6747bef90499bd68e54f52dd878ddc81834ac..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/main.py b/Backend/FastAPI/main.py
index ca00e91..09d72fa 100644
--- a/Backend/FastAPI/main.py
+++ b/Backend/FastAPI/main.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (24/11/2022): https://www.twitch.tv/videos/1661716599
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A
 
 ### Hola Mundo ###
 
@@ -12,16 +12,20 @@
 
 app = FastAPI()
 
-# Routers - Clase en vídeo (08/12/2022): https://www.twitch.tv/videos/1673759045
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=12475
 app.include_router(products.router)
 app.include_router(users.router)
 
-# Routers - Clase en vídeo (22/12/2022): https://www.twitch.tv/videos/1686104006
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=14094
 app.include_router(basic_auth_users.router)
+
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=17664
 app.include_router(jwt_auth_users.router)
+
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=20480
 app.include_router(users_db.router)
 
-# Recursos estáticos - Clase en vídeo (14/12/2022): https://www.twitch.tv/videos/1679022882
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=13618
 app.mount("/static", StaticFiles(directory="static"), name="static")
 
 
diff --git a/Backend/FastAPI/requirements.txt b/Backend/FastAPI/requirements.txt
index 802985d..8ab5160 100644
--- a/Backend/FastAPI/requirements.txt
+++ b/Backend/FastAPI/requirements.txt
@@ -1,4 +1,4 @@
-# Clase en vídeo (28/12/2022): https://www.twitch.tv/videos/1691208894
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=27335
 fastapi
 python-jose
 passlib
diff --git a/Backend/FastAPI/routers/__pycache__/basic_auth_users.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/basic_auth_users.cpython-310.pyc
deleted file mode 100644
index 45827c6a92f95a5308d5ba2a80ef40b23a225314..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/routers/__pycache__/jwt_auth_users.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/jwt_auth_users.cpython-310.pyc
deleted file mode 100644
index d2df27746760cd7abc73bdab7a266200df4094e5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/routers/__pycache__/products.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/products.cpython-310.pyc
deleted file mode 100644
index e41878c16f44ccc80af5ee98aa7adc10189ac429..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/routers/__pycache__/users.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/users.cpython-310.pyc
deleted file mode 100644
index 17f658ee516ad8d0a7a53ba98221178f438cb594..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/routers/__pycache__/users_db.cpython-310.pyc b/Backend/FastAPI/routers/__pycache__/users_db.cpython-310.pyc
deleted file mode 100644
index 2e252011684979444ac06f7f3bd991a81d1a1c91..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Backend/FastAPI/routers/basic_auth_users.py b/Backend/FastAPI/routers/basic_auth_users.py
index 73d7eba..054b991 100644
--- a/Backend/FastAPI/routers/basic_auth_users.py
+++ b/Backend/FastAPI/routers/basic_auth_users.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (14/12/2022): https://www.twitch.tv/videos/1679022882
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=14094
 
 ### Users API con autorización OAuth2 básica ###
 
diff --git a/Backend/FastAPI/routers/jwt_auth_users.py b/Backend/FastAPI/routers/jwt_auth_users.py
index 3c04002..c942b0c 100644
--- a/Backend/FastAPI/routers/jwt_auth_users.py
+++ b/Backend/FastAPI/routers/jwt_auth_users.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (14/12/2022): https://www.twitch.tv/videos/1679022882
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=17664
 
 ### Users API con autorización OAuth2 JWT ###
 
diff --git a/Backend/FastAPI/routers/products.py b/Backend/FastAPI/routers/products.py
index bebd917..6d85b33 100644
--- a/Backend/FastAPI/routers/products.py
+++ b/Backend/FastAPI/routers/products.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (08/12/2022): https://www.twitch.tv/videos/1673759045
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=12475
 
 ### Products API ###
 
diff --git a/Backend/FastAPI/routers/users.py b/Backend/FastAPI/routers/users.py
index 6ccbb19..46aca70 100644
--- a/Backend/FastAPI/routers/users.py
+++ b/Backend/FastAPI/routers/users.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (01/12/2022): https://www.twitch.tv/videos/1667582141
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=5382
 
 ### Users API ###
 
@@ -47,7 +47,7 @@ async def user(id: int):
     return search_user(id)
 
 
-# Clase en vídeo (08/12/2022): https://www.twitch.tv/videos/1673759045
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=8529
 
 
 @router.post("/user/", response_model=User, status_code=201)
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 270440d..7e61d75 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (22/12/2022): https://www.twitch.tv/videos/1686104006
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=20480
 
 ### Users DB API ###
 
diff --git a/Backend/type_hints.py b/Backend/type_hints.py
index 0e9bb57..42b7c01 100644
--- a/Backend/type_hints.py
+++ b/Backend/type_hints.py
@@ -1,4 +1,4 @@
-# Clase en vídeo (24/11/2022): https://www.twitch.tv/videos/1661716599
+# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=1810
 
 ### Type Hints ###
 
diff --git a/Images/header.jpg b/Images/header.jpg
index 3fa04edd2236361722c908ecd6d9a001288f1ca3..3c8c4c4e6cd8dcff822856ebb20ea8b5a2db342f 100644
GIT binary patch
diff --git a/Intermediate/mypackage/__pycache__/__init__.cpython-310.pyc b/Intermediate/mypackage/__pycache__/__init__.cpython-310.pyc
deleted file mode 100644
index e22069732ce769d91b4195cb0f1ad52389321e2c..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/Intermediate/mypackage/__pycache__/arithmetics.cpython-310.pyc b/Intermediate/mypackage/__pycache__/arithmetics.cpython-310.pyc
deleted file mode 100644
index 6e2cf7994364deea423de7023b3bb3fafc504ec8..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/README.md b/README.md
index 3e8417e..2a4f210 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,6 @@
 ### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
 > ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
 
-
 ## Clases en vídeo
 
 ### Curso de fundamentos desde cero
@@ -67,14 +66,28 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 
 > Código: Directorio "Backend" en el proyecto
 
-* [Clase 1 - 24/11/2022 - Hola Mundo en FastAPI](https://www.twitch.tv/videos/1661716599)
-* [Clase 2 - 01/12/2022 - Operaciones con GET y peticiones HTTP](https://www.twitch.tv/videos/1667582141)
-* [Clase 3 - 08/12/2022 - Operaciones con POST, PUT, DELETE, códigos HTTP y Routers](https://www.twitch.tv/videos/1673759045)
-* [Clase 4 - 14/12/2022 - Recursos estáticos y Autorización OAuth2](https://www.twitch.tv/videos/1679022882) 
-* [Clase 5 - 22/12/2022 - Base de datos con MongoDB](https://www.twitch.tv/videos/1686104006) 
-* [Clase 6 - 28/12/2022 - Despliegue en la nube usando MongoDB Atrlas y Deta](https://www.twitch.tv/videos/1691208894)
-
-**Muy pronto curso editado en YouTube...**
+<a href="https://youtu.be/_y9qQZXE24A"><img src="http://i3.ytimg.com/vi/_y9qQZXE24A/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
+* [Introducción](https://youtu.be/_y9qQZXE24A)
+* [Lección 01 - ¿Qué es un backend?](https://youtu.be/_y9qQZXE24A?t=125)
+* [Lección 02 - API y FastAPI](https://youtu.be/_y9qQZXE24A?t=834)
+* [Lección 03 - Type Hints](https://youtu.be/_y9qQZXE24A?t=1810)
+* [Lección 04 - Configuración FastAPI](https://youtu.be/_y9qQZXE24A?t=2629)
+* [Lección 05 - Hola mundo](https://youtu.be/_y9qQZXE24A?t=3504)
+* [Lección 06 - Operación GET](https://youtu.be/_y9qQZXE24A?t=5382)
+* [Lección 07 - Peticiones HTTP](https://youtu.be/_y9qQZXE24A?t=5925)
+* [Lección 08 - Creación API](https://youtu.be/_y9qQZXE24A?t=6099)
+* [Lección 09 - Path y Query](https://youtu.be/_y9qQZXE24A?t=7510)
+* [Lección 10 - Operaciones POST, PUT y DELETE](https://youtu.be/_y9qQZXE24A?t=8529)
+* [Lección 11 - HTTP status codes](https://youtu.be/_y9qQZXE24A?t=11072)
+* [Lección 12 - Routers](https://youtu.be/_y9qQZXE24A?t=12475)
+* [Lección 13 - Recursos estáticos](https://youtu.be/_y9qQZXE24A?t=13618)
+* [Lección 14 - Autorización OAuth2](https://youtu.be/_y9qQZXE24A?t=14094)
+* [Lección 15 - OAuth2 JWT](https://youtu.be/_y9qQZXE24A?t=17664)
+* [Lección 16 - MongoDB](https://youtu.be/_y9qQZXE24A?t=20480)
+* [Lección 17 - MongoDB Atlas](https://youtu.be/_y9qQZXE24A?t=25470)
+* [Lección 18 - Despliegue en Deta](https://youtu.be/_y9qQZXE24A?t=27335)
+* [Lección Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
 ## Información importante y preguntas frecuentes
 
diff --git a/__pycache__/module.cpython-310.pyc b/__pycache__/module.cpython-310.pyc
deleted file mode 100644
index 0d63bb63fcf06780639d20e9f71412492849cace..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/__pycache__/my_module.cpython-310.pyc b/__pycache__/my_module.cpython-310.pyc
deleted file mode 100644
index ca5d74d7bf51a1e3f975b64d6047395ec10e1b07..0000000000000000000000000000000000000000
GIT binary patch

From 25f62fa31c2a5ce9ef43ddccdd2e496dc3c231de Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Sun, 29 Jan 2023 07:19:42 +0100
Subject: [PATCH 03/28] Curiosidades

---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index 2a4f210..8f810c0 100644
--- a/README.md
+++ b/README.md
@@ -89,6 +89,12 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 * [Lección 18 - Despliegue en Deta](https://youtu.be/_y9qQZXE24A?t=27335)
 * [Lección Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
+### Extra: 15 curiosidades sobre Python
+
+Y para finalizar... ¿Quieres saber aun más sobre él? Aquí tienes 15 curiosidades que quizás no conozcas sobre el lenguaje.
+
+<a href="https://youtu.be/q2lCm2KAz3w"><img src="http://i3.ytimg.com/vi/q2lCm2KAz3w/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
 ## Información importante y preguntas frecuentes
 
 Actualmente el curso está en pausa. Se han finalizados los bloques básico, intermedio y backend, y ese era el objetivo inicial del proyecto.

From 34a49ee99b2acd296043f3a7cb39e4e64c2c38e3 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Sat, 25 Mar 2023 10:45:38 +0100
Subject: [PATCH 04/28] Curso de Python con ChatGPT [YouTube]

---
 README.md | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 8f810c0..f409da4 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,9 @@
 # Hello Python
 
 [![Python](https://img.shields.io/badge/Python-3.10+-yellow?style=for-the-badge&logo=python&logoColor=white&labelColor=101010)](https://python.org)
-[![FastAPI](https://img.shields.io/badge/FastAPI-0.88.0+-00a393?style=for-the-badge&logo=fastapi&logoColor=white&labelColor=101010)](https://python.org)
-[![MongoDB](https://img.shields.io/badge/MongoDB-6.0+-00684A?style=for-the-badge&logo=mongodb&logoColor=white&labelColor=101010)](https://python.org)
+[![FastAPI](https://img.shields.io/badge/FastAPI-0.88.0+-00a393?style=for-the-badge&logo=fastapi&logoColor=white&labelColor=101010)](https://fastapi.tiangolo.com)
+[![MongoDB](https://img.shields.io/badge/MongoDB-6.0+-00684A?style=for-the-badge&logo=mongodb&logoColor=white&labelColor=101010)](https://www.mongodb.com)
+[![ChatGPT](https://img.shields.io/badge/ChatGPT-GPT--4-7CF178?style=for-the-badge&logo=openai&logoColor=white&labelColor=101010)](https://platform.openai.com)
 
 ## Curso para aprender el lenguaje de programación Python desde cero y para principiantes
 
@@ -11,6 +12,15 @@
 ### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
 > ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
 
+## ¡Nuevo!
+### Aprende a integrar ChatGPT en tu proyecto desde cero
+
+<a href="https://youtu.be/b8COygWdvmw"><img src="http://i3.ytimg.com/vi/b8COygWdvmw/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
+Clase de una hora de duración donde aprenderás a interactuar con ChatGPT desde tu aplicación, mantener conversaciones y establecer el contexto de la IA para potenciar tu proyecto.
+
+Con todo el código publicado [aquí](https://gist.github.com/mouredev/58abfbcef017efaf3852e8821564c011).
+
 ## Clases en vídeo
 
 ### Curso de fundamentos desde cero
@@ -87,7 +97,7 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 * [Lección 16 - MongoDB](https://youtu.be/_y9qQZXE24A?t=20480)
 * [Lección 17 - MongoDB Atlas](https://youtu.be/_y9qQZXE24A?t=25470)
 * [Lección 18 - Despliegue en Deta](https://youtu.be/_y9qQZXE24A?t=27335)
-* [Lección Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
+* [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
 ### Extra: 15 curiosidades sobre Python
 

From e1d1444f21e99e5a5b6f20b2d05cf7edc3af97be Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 27 Mar 2023 21:58:52 +0200
Subject: [PATCH 05/28] =?UTF-8?q?Nueva=20informaci=C3=B3n=20sobre=20despli?=
 =?UTF-8?q?egue=20en=20Deta=20con=20FastAPI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index f409da4..6efde5e 100644
--- a/README.md
+++ b/README.md
@@ -96,9 +96,11 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 * [Lección 15 - OAuth2 JWT](https://youtu.be/_y9qQZXE24A?t=17664)
 * [Lección 16 - MongoDB](https://youtu.be/_y9qQZXE24A?t=20480)
 * [Lección 17 - MongoDB Atlas](https://youtu.be/_y9qQZXE24A?t=25470)
-* [Lección 18 - Despliegue en Deta](https://youtu.be/_y9qQZXE24A?t=27335)
+* [Lección 18 - Despliegue en Deta *](https://youtu.be/_y9qQZXE24A?t=27335)
 * [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
+***ACTUALIZACIÓN Sobre la lección 18:** Deta ha actualizado ligeramente su servicio de despliegue de aplicaciones con FastAPI. Tienes toda la documentación [aquí](https://deta.space/docs/en/quickstart-guides/python#fastapi). También han creado una [guía de migración](https://deta.space/migration/guides/migrate-a-micro/).
+
 ### Extra: 15 curiosidades sobre Python
 
 Y para finalizar... ¿Quieres saber aun más sobre él? Aquí tienes 15 curiosidades que quizás no conozcas sobre el lenguaje.

From 732f4ede3479b712648412848e8710cbb72cfefe Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Sat, 1 Apr 2023 08:34:41 +0200
Subject: [PATCH 06/28] =?UTF-8?q?Taller=20de=20introducci=C3=B3n=20al=20te?=
 =?UTF-8?q?sting=20con=20Python=20[YouTube]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index 6efde5e..b2783a8 100644
--- a/README.md
+++ b/README.md
@@ -101,6 +101,12 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 
 ***ACTUALIZACIÓN Sobre la lección 18:** Deta ha actualizado ligeramente su servicio de despliegue de aplicaciones con FastAPI. Tienes toda la documentación [aquí](https://deta.space/docs/en/quickstart-guides/python#fastapi). También han creado una [guía de migración](https://deta.space/migration/guides/migrate-a-micro/).
 
+### Introducción al Testing
+
+Taller de introducción a testing con Python creado junto a [Carlos Blé](https://www.carlosble.com) y [Miguel A. Gómez](https://softwarecrafters.io), expertos en la materia.
+
+<a href="https://youtu.be/344uwF1z2Gg"><img src="http://i3.ytimg.com/vi/344uwF1z2Gg/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
 ### Extra: 15 curiosidades sobre Python
 
 Y para finalizar... ¿Quieres saber aun más sobre él? Aquí tienes 15 curiosidades que quizás no conozcas sobre el lenguaje.

From 0221eb8fd30110f36b44744d5c2a63a3625733d1 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Tue, 3 Oct 2023 14:12:54 +0200
Subject: [PATCH 07/28] Curso de Python web

---
 README.md | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index b2783a8..99201b4 100644
--- a/README.md
+++ b/README.md
@@ -12,14 +12,11 @@
 ### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
 > ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
 
-## ¡Nuevo!
-### Aprende a integrar ChatGPT en tu proyecto desde cero
+## ¡NUEVO! Curso de Python para web
 
-<a href="https://youtu.be/b8COygWdvmw"><img src="http://i3.ytimg.com/vi/b8COygWdvmw/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+[![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web)
 
-Clase de una hora de duración donde aprenderás a interactuar con ChatGPT desde tu aplicación, mantener conversaciones y establecer el contexto de la IA para potenciar tu proyecto.
-
-Con todo el código publicado [aquí](https://gist.github.com/mouredev/58abfbcef017efaf3852e8821564c011).
+<a href="https://github.com/mouredev/python-web"><img src="https://raw.githubusercontent.com/mouredev/python-web/main/Images/header.jpg"/></a>
 
 ## Clases en vídeo
 
@@ -101,6 +98,14 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 
 ***ACTUALIZACIÓN Sobre la lección 18:** Deta ha actualizado ligeramente su servicio de despliegue de aplicaciones con FastAPI. Tienes toda la documentación [aquí](https://deta.space/docs/en/quickstart-guides/python#fastapi). También han creado una [guía de migración](https://deta.space/migration/guides/migrate-a-micro/).
 
+### Aprende a integrar ChatGPT en tu proyecto desde cero
+
+<a href="https://youtu.be/b8COygWdvmw"><img src="http://i3.ytimg.com/vi/b8COygWdvmw/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
+Clase de una hora de duración donde aprenderás a interactuar con ChatGPT desde tu aplicación, mantener conversaciones y establecer el contexto de la IA para potenciar tu proyecto.
+
+Con todo el código publicado [aquí](https://gist.github.com/mouredev/58abfbcef017efaf3852e8821564c011).
+
 ### Introducción al Testing
 
 Taller de introducción a testing con Python creado junto a [Carlos Blé](https://www.carlosble.com) y [Miguel A. Gómez](https://softwarecrafters.io), expertos en la materia.

From 8ec3f82e1c9acca23ad6c39b68f457bbc5e99fbb Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Fri, 15 Dec 2023 15:28:24 +0100
Subject: [PATCH 08/28] =?UTF-8?q?Publicaci=C3=B3n=20curso=20de=20Python=20?=
 =?UTF-8?q?Web?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Images/header.jpg | Bin 253557 -> 260102 bytes
 README.md         |  15 ++++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/Images/header.jpg b/Images/header.jpg
index 3c8c4c4e6cd8dcff822856ebb20ea8b5a2db342f..17aef3dd1c77087efd14ba4107d27389fe1ce7ed 100644
GIT binary patch
diff --git a/README.md b/README.md
index 99201b4..39a2dee 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,7 @@
 [![FastAPI](https://img.shields.io/badge/FastAPI-0.88.0+-00a393?style=for-the-badge&logo=fastapi&logoColor=white&labelColor=101010)](https://fastapi.tiangolo.com)
 [![MongoDB](https://img.shields.io/badge/MongoDB-6.0+-00684A?style=for-the-badge&logo=mongodb&logoColor=white&labelColor=101010)](https://www.mongodb.com)
 [![ChatGPT](https://img.shields.io/badge/ChatGPT-GPT--4-7CF178?style=for-the-badge&logo=openai&logoColor=white&labelColor=101010)](https://platform.openai.com)
+[![Reflex](https://img.shields.io/badge/Reflex-0.3.6+-5646ED?style=for-the-badge&logo=reflex&logoColor=white&labelColor=101010)](https://reflex.dev)
 
 ## Curso para aprender el lenguaje de programación Python desde cero y para principiantes
 
@@ -98,6 +99,18 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 
 ***ACTUALIZACIÓN Sobre la lección 18:** Deta ha actualizado ligeramente su servicio de despliegue de aplicaciones con FastAPI. Tienes toda la documentación [aquí](https://deta.space/docs/en/quickstart-guides/python#fastapi). También han creado una [guía de migración](https://deta.space/migration/guides/migrate-a-micro/).
 
+### Frontend desde cero
+
+Cursos en los que aprenderemos a utilizar Python para desarrollo web con dos proyectos reales desplegados en producción. Tutoriales en vídeo paso a paso con 9 horas de contenido.
+
+<a href="https://github.com/mouredev/python-web"><img src="http://i3.ytimg.com/vi/n2YrGsXJC6Y/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
+[![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web)
+
+<a href="https://github.com/mouredev/adeviento-web"><img src="http://i3.ytimg.com/vi/h8Tn0ITRoQs/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
+[![Curso Python Web](https://img.shields.io/github/stars/mouredev/adeviento-web?label=Tutorial%20Python%20web%20extra&style=social)](https://github.com/mouredev/adeviento-web)
+
 ### Aprende a integrar ChatGPT en tu proyecto desde cero
 
 <a href="https://youtu.be/b8COygWdvmw"><img src="http://i3.ytimg.com/vi/b8COygWdvmw/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
@@ -159,7 +172,7 @@ Si quieres unirte a nuestra comunidad de desarrollo, aprender programación de A
 ![GitHub Followers](https://img.shields.io/github/followers/mouredev?style=social)
 ![GitHub Followers](https://img.shields.io/github/stars/mouredev?style=social)
 
-Soy ingeniero de software desde hace más de 12 años. Desde hace 4 años combino mi trabajo desarrollando Apps con creación de contenido formativo sobre programación y tecnología en diferentes redes sociales como **[@mouredev](https://moure.dev)**.
+Soy ingeniero de software desde hace más de 13 años. Desde hace 4 años combino mi trabajo desarrollando Apps con creación de contenido formativo sobre programación y tecnología en diferentes redes sociales como **[@mouredev](https://moure.dev)**.
 
 ### En mi perfil de GitHub tienes más información
 

From 023bd4a1db1dc31c3e25324d341589004dd21466 Mon Sep 17 00:00:00 2001
From: MoureDev <braismoure@mouredev.com>
Date: Fri, 5 Apr 2024 15:15:05 +0200
Subject: [PATCH 09/28] =?UTF-8?q?Publicaci=C3=B3n=20curso=20de=20Python=20?=
 =?UTF-8?q?Web=20Avanzado?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Images/header.jpg | Bin 260102 -> 260383 bytes
 README.md         |  10 ++++------
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/Images/header.jpg b/Images/header.jpg
index 17aef3dd1c77087efd14ba4107d27389fe1ce7ed..c5522ddb84c402916845eafad0b5312e24fc7a41 100644
GIT binary patch
diff --git a/README.md b/README.md
index 39a2dee..9ace4d1 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 [![FastAPI](https://img.shields.io/badge/FastAPI-0.88.0+-00a393?style=for-the-badge&logo=fastapi&logoColor=white&labelColor=101010)](https://fastapi.tiangolo.com)
 [![MongoDB](https://img.shields.io/badge/MongoDB-6.0+-00684A?style=for-the-badge&logo=mongodb&logoColor=white&labelColor=101010)](https://www.mongodb.com)
 [![ChatGPT](https://img.shields.io/badge/ChatGPT-GPT--4-7CF178?style=for-the-badge&logo=openai&logoColor=white&labelColor=101010)](https://platform.openai.com)
-[![Reflex](https://img.shields.io/badge/Reflex-0.3.6+-5646ED?style=for-the-badge&logo=reflex&logoColor=white&labelColor=101010)](https://reflex.dev)
+[![Reflex](https://img.shields.io/badge/Reflex-0.4.6+-5646ED?style=for-the-badge&logo=reflex&logoColor=white&labelColor=101010)](https://reflex.dev)
 
 ## Curso para aprender el lenguaje de programación Python desde cero y para principiantes
 
@@ -105,6 +105,8 @@ Cursos en los que aprenderemos a utilizar Python para desarrollo web con dos pro
 
 <a href="https://github.com/mouredev/python-web"><img src="http://i3.ytimg.com/vi/n2YrGsXJC6Y/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
 
+<a href="https://github.com/mouredev/python-web"><img src="http://i3.ytimg.com/vi/bNy8OZJfA6I/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
 [![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web)
 
 <a href="https://github.com/mouredev/adeviento-web"><img src="http://i3.ytimg.com/vi/h8Tn0ITRoQs/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
@@ -152,10 +154,6 @@ No descarto añadir nuevas lecciones a futuro, pero creo que por el momento pued
 * [MongoDB](https://www.mongodb.com/): La base de datos que utiliza nuestro backend
 * [Deta](https://www.deta.sh/): Para desplegar nuestra API en la nube
 
-#### Puedes apoyar mi trabajo haciendo "☆ Star" en el repo o nominarme a "GitHub Star". ¡Gracias!
-
-[![GitHub Star](https://img.shields.io/badge/GitHub-Nominar_a_star-yellow?style=for-the-badge&logo=github&logoColor=white&labelColor=101010)](https://stars.github.com/nominate/)
-
 Si quieres unirte a nuestra comunidad de desarrollo, aprender programación de Apps, mejorar tus habilidades y ayudar a la continuidad del proyecto, puedes encontrarnos en:
 
 [![Twitch](https://img.shields.io/badge/Twitch-Programación_en_directo-9146FF?style=for-the-badge&logo=twitch&logoColor=white&labelColor=101010)](https://twitch.tv/mouredev)
@@ -172,7 +170,7 @@ Si quieres unirte a nuestra comunidad de desarrollo, aprender programación de A
 ![GitHub Followers](https://img.shields.io/github/followers/mouredev?style=social)
 ![GitHub Followers](https://img.shields.io/github/stars/mouredev?style=social)
 
-Soy ingeniero de software desde hace más de 13 años. Desde hace 4 años combino mi trabajo desarrollando Apps con creación de contenido formativo sobre programación y tecnología en diferentes redes sociales como **[@mouredev](https://moure.dev)**.
+Soy ingeniero de software desde 2010. Desde 2018 combino mi trabajo desarrollando Apps con la creación de contenido formativo sobre programación y tecnología en diferentes redes sociales como **[@mouredev](https://moure.dev)**.
 
 ### En mi perfil de GitHub tienes más información
 

From 5793a86879fcc32610a5c5fde39ad83e98f9984f Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Fri, 2 Aug 2024 10:04:11 +0200
Subject: [PATCH 10/28] Tutorial traductor de voz

---
 README.md | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/README.md b/README.md
index 9ace4d1..2dafc69 100644
--- a/README.md
+++ b/README.md
@@ -121,6 +121,14 @@ Clase de una hora de duración donde aprenderás a interactuar con ChatGPT desde
 
 Con todo el código publicado [aquí](https://gist.github.com/mouredev/58abfbcef017efaf3852e8821564c011).
 
+### Traductor de Voz con IA
+
+<a href="https://youtu.be/oxLvf2nDCvQ"><img src="http://i3.ytimg.com/vi/oxLvf2nDCvQ/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
+
+Aprende a desarrollar un traductor de voz a varios idiomas utilizando con IA. Creando su Web y todo en 100 líneas.
+
+Con todo el código publicado [aquí](https://gist.github.com/mouredev/0ea42112751f0187d90d5403d1f333e2).
+
 ### Introducción al Testing
 
 Taller de introducción a testing con Python creado junto a [Carlos Blé](https://www.carlosble.com) y [Miguel A. Gómez](https://softwarecrafters.io), expertos en la materia.

From ee6956aaddeef173bbc530f0d4303b9c96a2667c Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Tue, 24 Sep 2024 11:00:32 +0200
Subject: [PATCH 11/28] =?UTF-8?q?Correcci=C3=B3n=20texto?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Basic/09_loops.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Basic/09_loops.py b/Basic/09_loops.py
index b7d476a..6db69d9 100644
--- a/Basic/09_loops.py
+++ b/Basic/09_loops.py
@@ -47,7 +47,7 @@
     if element == "Edad":
         break
 else:
-    print("El bluce for para diccionario ha finalizado")
+    print("El bucle for para el diccionario ha finalizado")
 
 print("La ejecución continúa")
 

From 33946c35b4a889030134335e1bb48afab30bb1bf Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Fri, 22 Nov 2024 11:15:25 +0100
Subject: [PATCH 12/28] mouredev pro

---
 Images/pro.jpg | Bin 0 -> 289611 bytes
 README.md      |  18 ++++++++++++------
 2 files changed, 12 insertions(+), 6 deletions(-)
 create mode 100644 Images/pro.jpg

diff --git a/Images/pro.jpg b/Images/pro.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..986b7705489387cccc9c934c76eebc7bd3d79705
GIT binary patch
diff --git a/README.md b/README.md
index 2dafc69..c93afa6 100644
--- a/README.md
+++ b/README.md
@@ -162,11 +162,15 @@ No descarto añadir nuevas lecciones a futuro, pero creo que por el momento pued
 * [MongoDB](https://www.mongodb.com/): La base de datos que utiliza nuestro backend
 * [Deta](https://www.deta.sh/): Para desplegar nuestra API en la nube
 
-Si quieres unirte a nuestra comunidad de desarrollo, aprender programación de Apps, mejorar tus habilidades y ayudar a la continuidad del proyecto, puedes encontrarnos en:
+## Únete al campus de programación de la comunidad
 
-[![Twitch](https://img.shields.io/badge/Twitch-Programación_en_directo-9146FF?style=for-the-badge&logo=twitch&logoColor=white&labelColor=101010)](https://twitch.tv/mouredev)
-[![Discord](https://img.shields.io/badge/Discord-Servidor_de_la_comunidad-5865F2?style=for-the-badge&logo=discord&logoColor=white&labelColor=101010)](https://mouredev.com/discord)
-[![Link](https://img.shields.io/badge/Links_de_interés-moure.dev-39E09B?style=for-the-badge&logo=Linktree&logoColor=white&labelColor=101010)](https://moure.dev)
+![https://mouredev.pro](./Images/pro.jpg)
+
+#### Te presento [mouredev pro](https://mouredev.pro), mi proyecto más importante para ayudarte a estudiar programación y desarrollo de software de manera diferente.
+
+> **¿Buscas un extra?** Aquí encontrarás este y otros cursos editados por lecciones individuales, para avanzar a tu ritmo y guardar el progreso. También dispondrás de ejercicios y correcciones, test para validar tus conocimientos, examen y certificado público de finalización, soporte, foro de estudiantes, reunionnes grupales, cursos exclusivos y mucho más.
+> 
+> Entra en **[mouredev.pro](https://mouredev.pro)** y utiliza el cupón **"PYTHON"** con un 10% de descuento en tu primera suscripción.
 
 ## ![https://mouredev.com](https://raw.githubusercontent.com/mouredev/mouredev/master/mouredev_emote.png) Hola, mi nombre es Brais Moure.
 ### Freelance full-stack iOS & Android engineer
@@ -180,6 +184,8 @@ Si quieres unirte a nuestra comunidad de desarrollo, aprender programación de A
 
 Soy ingeniero de software desde 2010. Desde 2018 combino mi trabajo desarrollando Apps con la creación de contenido formativo sobre programación y tecnología en diferentes redes sociales como **[@mouredev](https://moure.dev)**.
 
-### En mi perfil de GitHub tienes más información
+Si quieres unirte a nuestra comunidad de desarrollo, aprender programación, mejorar tus habilidades y ayudar a la continuidad del proyecto, puedes encontrarnos en:
 
-[![Web](https://img.shields.io/badge/GitHub-MoureDev-14a1f0?style=for-the-badge&logo=github&logoColor=white&labelColor=101010)](https://github.com/mouredev)
+[![Twitch](https://img.shields.io/badge/Twitch-Programación_en_directo-9146FF?style=for-the-badge&logo=twitch&logoColor=white&labelColor=101010)](https://twitch.tv/mouredev)
+[![Discord](https://img.shields.io/badge/Discord-Servidor_de_la_comunidad-5865F2?style=for-the-badge&logo=discord&logoColor=white&labelColor=101010)](https://mouredev.com/discord) [![Pro](https://img.shields.io/badge/Cursos-mouredev.pro-FF5500?style=for-the-badge&logo=gnometerminal&logoColor=white&labelColor=101010)](https://moure.dev)
+[![Link](https://img.shields.io/badge/Links_de_interés-moure.dev-14a1f0?style=for-the-badge&logo=Linktree&logoColor=white&labelColor=101010)](https://moure.dev) [![Web](https://img.shields.io/badge/GitHub-MoureDev-087ec4?style=for-the-badge&logo=github&logoColor=white&labelColor=101010)](https://github.com/mouredev)

From ffe8aad0f63ddf14a19129860e971bd91b939b67 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Fri, 20 Dec 2024 07:43:34 +0100
Subject: [PATCH 13/28] =?UTF-8?q?Correcci=C3=B3n=20ortogr=C3=A1fica=2011?=
 =?UTF-8?q?=5Fclasses.py?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Basic/11_classes.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Basic/11_classes.py b/Basic/11_classes.py
index ec3c2ec..28e8469 100644
--- a/Basic/11_classes.py
+++ b/Basic/11_classes.py
@@ -11,7 +11,7 @@ class MyEmptyPerson:
 print(MyEmptyPerson)
 print(MyEmptyPerson())
 
-# Clase con constructor, funciones y popiedades privadas y públicas
+# Clase con constructor, funciones y propiedades privadas y públicas
 
 
 class Person:

From 95d24edefbc7a364aaa4943185e22d418f8d38dd Mon Sep 17 00:00:00 2001
From: MoureDev <braismoure@mouredev.com>
Date: Fri, 28 Feb 2025 09:46:30 +0100
Subject: [PATCH 14/28] Correcciones curso intermedio

---
 Intermediate/02_challenges.py          |  2 +-
 Intermediate/03_lambdas.py             | 15 +++------------
 Intermediate/05_error_types.py         |  4 ++--
 Intermediate/06_file_handling.py       |  3 ---
 Intermediate/07_regular_expressions.py |  2 --
 5 files changed, 6 insertions(+), 20 deletions(-)

diff --git a/Intermediate/02_challenges.py b/Intermediate/02_challenges.py
index 36bef0a..a816e67 100644
--- a/Intermediate/02_challenges.py
+++ b/Intermediate/02_challenges.py
@@ -16,7 +16,7 @@
 def fizzbuzz():
     for index in range(1, 101):
         if index % 3 == 0 and index % 5 == 0:
-            print("fizzbuz")
+            print("fizzbuzz")
         elif index % 3 == 0:
             print("fizz")
         elif index % 5 == 0:
diff --git a/Intermediate/03_lambdas.py b/Intermediate/03_lambdas.py
index d23507a..d51f8fd 100644
--- a/Intermediate/03_lambdas.py
+++ b/Intermediate/03_lambdas.py
@@ -2,22 +2,13 @@
 
 ### Lambdas ###
 
-def sum_two_values(
-    first_value, second_value): return first_value + second_value
-
-
+sum_two_values = lambda first_value, second_value: first_value + second_value
 print(sum_two_values(2, 4))
 
-
-def multiply_values(
-    first_value, second_value): return first_value * second_value - 3
-
-
+multiply_values = lambda first_value, second_value: first_value * second_value - 3
 print(multiply_values(2, 4))
 
-
 def sum_three_values(value):
     return lambda first_value, second_value: first_value + second_value + value
 
-
-print(sum_three_values(5)(2, 4))
+print(sum_three_values(5)(2, 4))
\ No newline at end of file
diff --git a/Intermediate/05_error_types.py b/Intermediate/05_error_types.py
index 853f329..62566c8 100644
--- a/Intermediate/05_error_types.py
+++ b/Intermediate/05_error_types.py
@@ -42,8 +42,8 @@
 print(pi)
 
 # ValueError
-#my_int = int("10 Años")
-my_int = int("10")  # Descomentar para Error
+# my_int = int("10 Años") # Descomentar para Error
+my_int = int("10")
 print(type(my_int))
 
 # ZeroDivisionError
diff --git a/Intermediate/06_file_handling.py b/Intermediate/06_file_handling.py
index 05ab8df..65bf1b5 100644
--- a/Intermediate/06_file_handling.py
+++ b/Intermediate/06_file_handling.py
@@ -32,11 +32,8 @@
 
 # os.remove("Intermediate/my_file.txt")
 
-# Clase en vídeo (03/11/22): https://www.twitch.tv/videos/1642512950
-
 # .json file
 
-
 json_file = open("Intermediate/my_file.json", "w+")
 
 json_test = {
diff --git a/Intermediate/07_regular_expressions.py b/Intermediate/07_regular_expressions.py
index d2b1f9a..086d79b 100644
--- a/Intermediate/07_regular_expressions.py
+++ b/Intermediate/07_regular_expressions.py
@@ -45,8 +45,6 @@
 print(re.sub("[l|L]ección", "LECCIÓN", my_string))
 print(re.sub("Expresiones Regulares", "RegEx", my_string))
 
-# Clase en vídeo (09/11/22): https://www.twitch.tv/videos/1648023317
-
 ### Regular Expressions Patterns ###
 
 # Para aprender y validar expresiones regulares: https://regex101.com

From 50ddfc71987b74da2bb722fefba82180411ba1bc Mon Sep 17 00:00:00 2001
From: MoureDev <braismoure@mouredev.com>
Date: Fri, 28 Feb 2025 13:39:33 +0100
Subject: [PATCH 15/28] Correcciones curso intermedio

---
 Intermediate/06_file_handling.py | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/Intermediate/06_file_handling.py b/Intermediate/06_file_handling.py
index 65bf1b5..3bf072b 100644
--- a/Intermediate/06_file_handling.py
+++ b/Intermediate/06_file_handling.py
@@ -10,24 +10,43 @@
 # .txt file
 
 # Leer, escribir y sobrescribir si ya existe
-txt_file = open("Intermediate/my_file.txt", "w+")
+txt_file = open("my_file.txt", "w+")
 
 txt_file.write(
     "Mi nombre es Brais\nMi apellido es Moure\n35 años\nY mi lenguaje preferido es Python")
 
-# print(txt_file.read())
+# Posiciona el cursor al inicio del fichero
+txt_file.seek(0)
+
+# Lee e imprime todo el contenido del fichero
+print(txt_file.read())
+
+# Lee e imprime 10 caracteres desde el inicio del fichero
+txt_file.seek(0)
 print(txt_file.read(10))
+
+# Lee e imprime el resto de la línea actual desde la posición 11
 print(txt_file.readline())
+
+# Lee e imprime la siguiente línea
 print(txt_file.readline())
+
+# Lee e imprime las líneas restantes del fichero
 for line in txt_file.readlines():
     print(line)
 
+# Escribe una nueva línea en el fichero
 txt_file.write("\nAunque también me gusta Kotlin")
-print(txt_file.readline())
 
+# Posiciona el cursor al inicio del fichero, lee e imprime todo su contenido
+txt_file.seek(0)
+print(txt_file.read())
+
+# Cierra el fichero
 txt_file.close()
 
-with open("Intermediate/my_file.txt", "a") as my_other_file:
+# Agrega una nueva línea en el fichero
+with open("my_file.txt", "a") as my_other_file:
     my_other_file.write("\nY Swift")
 
 # os.remove("Intermediate/my_file.txt")

From ff7e39690683da903ff448a50ecfab465138ae63 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 07:23:46 +0200
Subject: [PATCH 16/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/db/models/user.py           |   2 +-
 Backend/FastAPI/routers/basic_auth_users.py |   4 +-
 Backend/FastAPI/routers/jwt_auth_users.py   |   7 +-
 README.md                                   | 134 ++++++++++----------
 4 files changed, 72 insertions(+), 75 deletions(-)

diff --git a/Backend/FastAPI/db/models/user.py b/Backend/FastAPI/db/models/user.py
index b26dc09..73d5766 100644
--- a/Backend/FastAPI/db/models/user.py
+++ b/Backend/FastAPI/db/models/user.py
@@ -7,6 +7,6 @@
 
 
 class User(BaseModel):
-    id: Optional[str]
+    id: Optional[str] = None
     username: str
     email: str
diff --git a/Backend/FastAPI/routers/basic_auth_users.py b/Backend/FastAPI/routers/basic_auth_users.py
index 054b991..21b65fa 100644
--- a/Backend/FastAPI/routers/basic_auth_users.py
+++ b/Backend/FastAPI/routers/basic_auth_users.py
@@ -28,14 +28,14 @@ class UserDB(User):
     "mouredev": {
         "username": "mouredev",
         "full_name": "Brais Moure",
-        "email": "braismoure@mourede.com",
+        "email": "braismoure@mouredev.com",
         "disabled": False,
         "password": "123456"
     },
     "mouredev2": {
         "username": "mouredev2",
         "full_name": "Brais Moure 2",
-        "email": "braismoure2@mourede.com",
+        "email": "braismoure2@mouredev.com",
         "disabled": True,
         "password": "654321"
     }
diff --git a/Backend/FastAPI/routers/jwt_auth_users.py b/Backend/FastAPI/routers/jwt_auth_users.py
index c942b0c..8cb57b3 100644
--- a/Backend/FastAPI/routers/jwt_auth_users.py
+++ b/Backend/FastAPI/routers/jwt_auth_users.py
@@ -8,6 +8,7 @@
 from jose import jwt, JWTError
 from passlib.context import CryptContext
 from datetime import datetime, timedelta
+import timezone
 
 ALGORITHM = "HS256"
 ACCESS_TOKEN_DURATION = 1
@@ -37,14 +38,14 @@ class UserDB(User):
     "mouredev": {
         "username": "mouredev",
         "full_name": "Brais Moure",
-        "email": "braismoure@mourede.com",
+        "email": "braismoure@mouredev.com",
         "disabled": False,
         "password": "$2a$12$B2Gq.Dps1WYf2t57eiIKjO4DXC3IUMUXISJF62bSRiFfqMdOI2Xa6"
     },
     "mouredev2": {
         "username": "mouredev2",
         "full_name": "Brais Moure 2",
-        "email": "braismoure2@mourede.com",
+        "email": "braismoure2@mouredev.com",
         "disabled": True,
         "password": "$2a$12$SduE7dE.i3/ygwd0Kol8bOFvEABaoOOlC8JsCSr6wpwB4zl5STU4S"
     }
@@ -103,7 +104,7 @@ async def login(form: OAuth2PasswordRequestForm = Depends()):
             status_code=status.HTTP_400_BAD_REQUEST, detail="La contraseña no es correcta")
 
     access_token = {"sub": user.username,
-                    "exp": datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_DURATION)}
+                    "exp": datetime.now(timezone.utc) + timedelta(minutes=ACCESS_TOKEN_DURATION)}
 
     return {"access_token": jwt.encode(access_token, SECRET, algorithm=ALGORITHM), "token_type": "bearer"}
 
diff --git a/README.md b/README.md
index c93afa6..193dcdc 100644
--- a/README.md
+++ b/README.md
@@ -11,13 +11,8 @@
 ![](./Images/header.jpg)
 
 ### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
-> ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
-
-## ¡NUEVO! Curso de Python para web
-
-[![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web)
 
-<a href="https://github.com/mouredev/python-web"><img src="https://raw.githubusercontent.com/mouredev/python-web/main/Images/header.jpg"/></a>
+> ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
 
 ## Clases en vídeo
 
@@ -29,44 +24,44 @@ Curso que agrupa todas las clases en directo que hacen referencia a los fundamen
 
 <a href="https://youtu.be/Kp4Mvapo5kc"><img src="http://i3.ytimg.com/vi/Kp4Mvapo5kc/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
 
-* [Introducción](https://youtu.be/Kp4Mvapo5kc)
-* [Contexto](https://youtu.be/Kp4Mvapo5kc?t=244)
-* [Lección 1 - Configuración](https://youtu.be/Kp4Mvapo5kc?t=850)
-* [Lección 2 - Hola Mundo](https://youtu.be/Kp4Mvapo5kc?t=1518)
-* [Lección 3 - Variables](https://youtu.be/Kp4Mvapo5kc?t=2938)
-* [Lección 4 - Operadores](https://youtu.be/Kp4Mvapo5kc?t=5665)
-* [Lección 5 - Strings](https://youtu.be/Kp4Mvapo5kc?t=8643)
-* [Lección 6 - Listas](https://youtu.be/Kp4Mvapo5kc?t=10872)
-* [Lección 7 - Tuplas](https://youtu.be/Kp4Mvapo5kc?t=14711)
-* [Lección 8 - Sets](https://youtu.be/Kp4Mvapo5kc?t=16335)
-* [Lección 9 - Diccionarios](https://youtu.be/Kp4Mvapo5kc?t=18506)
-* [Lección 10 - Condicionales](https://youtu.be/Kp4Mvapo5kc?t=21442)
-* [Lección 11 - Bucles/Loops/Ciclos](https://youtu.be/Kp4Mvapo5kc?t=23822)
-* [Lección 12 - Funciones](https://youtu.be/Kp4Mvapo5kc?t=26619)
-* [Lección 13 - Clases](https://youtu.be/Kp4Mvapo5kc?t=29327)
-* [Lección 14 - Excepciones](https://youtu.be/Kp4Mvapo5kc?t=32030)
-* [Lección 15 - Módulos](https://youtu.be/Kp4Mvapo5kc?t=34583)
-* [Próximos pasos](https://youtu.be/Kp4Mvapo5kc?t=36390)
+- [Introducción](https://youtu.be/Kp4Mvapo5kc)
+- [Contexto](https://youtu.be/Kp4Mvapo5kc?t=244)
+- [Lección 1 - Configuración](https://youtu.be/Kp4Mvapo5kc?t=850)
+- [Lección 2 - Hola Mundo](https://youtu.be/Kp4Mvapo5kc?t=1518)
+- [Lección 3 - Variables](https://youtu.be/Kp4Mvapo5kc?t=2938)
+- [Lección 4 - Operadores](https://youtu.be/Kp4Mvapo5kc?t=5665)
+- [Lección 5 - Strings](https://youtu.be/Kp4Mvapo5kc?t=8643)
+- [Lección 6 - Listas](https://youtu.be/Kp4Mvapo5kc?t=10872)
+- [Lección 7 - Tuplas](https://youtu.be/Kp4Mvapo5kc?t=14711)
+- [Lección 8 - Sets](https://youtu.be/Kp4Mvapo5kc?t=16335)
+- [Lección 9 - Diccionarios](https://youtu.be/Kp4Mvapo5kc?t=18506)
+- [Lección 10 - Condicionales](https://youtu.be/Kp4Mvapo5kc?t=21442)
+- [Lección 11 - Bucles/Loops/Ciclos](https://youtu.be/Kp4Mvapo5kc?t=23822)
+- [Lección 12 - Funciones](https://youtu.be/Kp4Mvapo5kc?t=26619)
+- [Lección 13 - Clases](https://youtu.be/Kp4Mvapo5kc?t=29327)
+- [Lección 14 - Excepciones](https://youtu.be/Kp4Mvapo5kc?t=32030)
+- [Lección 15 - Módulos](https://youtu.be/Kp4Mvapo5kc?t=34583)
+- [Próximos pasos](https://youtu.be/Kp4Mvapo5kc?t=36390)
 
 ### Curso intermedio de fundamentos desde cero
 
 Curso en el que continuamos aprendiendo Python desde sus bases, siguiendo la ruta de aprendizaje desde la última lección del curso de inicial.
 
 > Código: Directorio "Intermediate" en el proyecto
- 
+
 <a href="https://youtu.be/TbcEqkabAWU"><img src="http://i3.ytimg.com/vi/TbcEqkabAWU/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
 
-* [Introducción](https://youtu.be/TbcEqkabAWU)
-* [Lección 1 - Dates](https://youtu.be/TbcEqkabAWU?t=202)
-* [Lección 2 - List Comprehension](https://youtu.be/TbcEqkabAWU?t=3239)
-* [Lección 3 - Resolución de retos de programación](https://youtu.be/TbcEqkabAWU?t=4142)
-* [Lección 4 - Lambdas](https://youtu.be/TbcEqkabAWU?t=9145)
-* [Lección 5 - Funciones de orden superior](https://youtu.be/TbcEqkabAWU?t=10172)
-* [Lección 6 - Tipos de error](https://youtu.be/TbcEqkabAWU?t=12721)
-* [Lección 7 - Manejo de ficheros](https://youtu.be/TbcEqkabAWU?t=15524)
-* [Lección 8 - Expresiones regulares](https://youtu.be/TbcEqkabAWU?t=19762)
-* [Lección 9 - Manejo de paquetes](https://youtu.be/TbcEqkabAWU?t=24010)
-* [Próximos pasos](https://youtu.be/TbcEqkabAWU?t=26228)
+- [Introducción](https://youtu.be/TbcEqkabAWU)
+- [Lección 1 - Dates](https://youtu.be/TbcEqkabAWU?t=202)
+- [Lección 2 - List Comprehension](https://youtu.be/TbcEqkabAWU?t=3239)
+- [Lección 3 - Resolución de retos de programación](https://youtu.be/TbcEqkabAWU?t=4142)
+- [Lección 4 - Lambdas](https://youtu.be/TbcEqkabAWU?t=9145)
+- [Lección 5 - Funciones de orden superior](https://youtu.be/TbcEqkabAWU?t=10172)
+- [Lección 6 - Tipos de error](https://youtu.be/TbcEqkabAWU?t=12721)
+- [Lección 7 - Manejo de ficheros](https://youtu.be/TbcEqkabAWU?t=15524)
+- [Lección 8 - Expresiones regulares](https://youtu.be/TbcEqkabAWU?t=19762)
+- [Lección 9 - Manejo de paquetes](https://youtu.be/TbcEqkabAWU?t=24010)
+- [Próximos pasos](https://youtu.be/TbcEqkabAWU?t=26228)
 
 ### Backend desde cero
 
@@ -76,28 +71,28 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 
 <a href="https://youtu.be/_y9qQZXE24A"><img src="http://i3.ytimg.com/vi/_y9qQZXE24A/maxresdefault.jpg" style="height: 50%; width:50%;"/></a>
 
-* [Introducción](https://youtu.be/_y9qQZXE24A)
-* [Lección 01 - ¿Qué es un backend?](https://youtu.be/_y9qQZXE24A?t=125)
-* [Lección 02 - API y FastAPI](https://youtu.be/_y9qQZXE24A?t=834)
-* [Lección 03 - Type Hints](https://youtu.be/_y9qQZXE24A?t=1810)
-* [Lección 04 - Configuración FastAPI](https://youtu.be/_y9qQZXE24A?t=2629)
-* [Lección 05 - Hola mundo](https://youtu.be/_y9qQZXE24A?t=3504)
-* [Lección 06 - Operación GET](https://youtu.be/_y9qQZXE24A?t=5382)
-* [Lección 07 - Peticiones HTTP](https://youtu.be/_y9qQZXE24A?t=5925)
-* [Lección 08 - Creación API](https://youtu.be/_y9qQZXE24A?t=6099)
-* [Lección 09 - Path y Query](https://youtu.be/_y9qQZXE24A?t=7510)
-* [Lección 10 - Operaciones POST, PUT y DELETE](https://youtu.be/_y9qQZXE24A?t=8529)
-* [Lección 11 - HTTP status codes](https://youtu.be/_y9qQZXE24A?t=11072)
-* [Lección 12 - Routers](https://youtu.be/_y9qQZXE24A?t=12475)
-* [Lección 13 - Recursos estáticos](https://youtu.be/_y9qQZXE24A?t=13618)
-* [Lección 14 - Autorización OAuth2](https://youtu.be/_y9qQZXE24A?t=14094)
-* [Lección 15 - OAuth2 JWT](https://youtu.be/_y9qQZXE24A?t=17664)
-* [Lección 16 - MongoDB](https://youtu.be/_y9qQZXE24A?t=20480)
-* [Lección 17 - MongoDB Atlas](https://youtu.be/_y9qQZXE24A?t=25470)
-* [Lección 18 - Despliegue en Deta *](https://youtu.be/_y9qQZXE24A?t=27335)
-* [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
-
-***ACTUALIZACIÓN Sobre la lección 18:** Deta ha actualizado ligeramente su servicio de despliegue de aplicaciones con FastAPI. Tienes toda la documentación [aquí](https://deta.space/docs/en/quickstart-guides/python#fastapi). También han creado una [guía de migración](https://deta.space/migration/guides/migrate-a-micro/).
+- [Introducción](https://youtu.be/_y9qQZXE24A)
+- [Lección 01 - ¿Qué es un backend?](https://youtu.be/_y9qQZXE24A?t=125)
+- [Lección 02 - API y FastAPI](https://youtu.be/_y9qQZXE24A?t=834)
+- [Lección 03 - Type Hints](https://youtu.be/_y9qQZXE24A?t=1810)
+- [Lección 04 - Configuración FastAPI](https://youtu.be/_y9qQZXE24A?t=2629)
+- [Lección 05 - Hola mundo](https://youtu.be/_y9qQZXE24A?t=3504)
+- [Lección 06 - Operación GET](https://youtu.be/_y9qQZXE24A?t=5382)
+- [Lección 07 - Peticiones HTTP](https://youtu.be/_y9qQZXE24A?t=5925)
+- [Lección 08 - Creación API](https://youtu.be/_y9qQZXE24A?t=6099)
+- [Lección 09 - Path y Query](https://youtu.be/_y9qQZXE24A?t=7510)
+- [Lección 10 - Operaciones POST, PUT y DELETE](https://youtu.be/_y9qQZXE24A?t=8529)
+- [Lección 11 - HTTP status codes](https://youtu.be/_y9qQZXE24A?t=11072)
+- [Lección 12 - Routers](https://youtu.be/_y9qQZXE24A?t=12475)
+- [Lección 13 - Recursos estáticos](https://youtu.be/_y9qQZXE24A?t=13618)
+- [Lección 14 - Autorización OAuth2](https://youtu.be/_y9qQZXE24A?t=14094)
+- [Lección 15 - OAuth2 JWT](https://youtu.be/_y9qQZXE24A?t=17664)
+- [Lección 16 - MongoDB](https://youtu.be/_y9qQZXE24A?t=20480)
+- [Lección 17 - MongoDB Atlas](https://youtu.be/_y9qQZXE24A?t=25470)
+- [Lección 18 - Despliegue en Deta \*](https://youtu.be/_y9qQZXE24A?t=27335)
+- [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
+
+**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/) y utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados, como [Render](https://render.com/).
 
 ### Frontend desde cero
 
@@ -146,21 +141,21 @@ Y para finalizar... ¿Quieres saber aun más sobre él? Aquí tienes 15 curiosid
 Actualmente el curso está en pausa. Se han finalizados los bloques básico, intermedio y backend, y ese era el objetivo inicial del proyecto.
 No descarto añadir nuevas lecciones a futuro, pero creo que por el momento puede servir de base a cualquier persona que quiera empezar a aprender este lenguaje.
 
-* Recuerda que he creado en el [Discord](https://discord.gg/mouredev) un canal "🐍python" para que puedas comentar lo que quieras.
-* En el momento que el curso continúe, actualizaré el repositorio y avisaré en redes.
+- Recuerda que he creado en el [Discord](https://discord.gg/mouredev) un canal "🐍python" para que puedas comentar lo que quieras.
+- En el momento que el curso continúe, actualizaré el repositorio y avisaré en redes.
 
 ¡Muchísimas gracias por todo el apoyo mostrado!
 
 ## Enlaces de interés
 
-* [Web oficial de Python](https://www.python.org/)
-* [Tutorial oficial de Python en Español](https://docs.python.org/es/3/tutorial/index.html)
-* [Repo 30 días de Python](https://github.com/Asabeneh/30-Days-Of-Python)
-* [Juego Codédex para aprender Python](https://www.codedex.io/)
-* [Visual Studio Code](https://code.visualstudio.com/): El editor que estoy usando
-* [FastAPI](https://fastapi.tiangolo.com/es/): El framework para crear nuestra API Backend
-* [MongoDB](https://www.mongodb.com/): La base de datos que utiliza nuestro backend
-* [Deta](https://www.deta.sh/): Para desplegar nuestra API en la nube
+- [Web oficial de Python](https://www.python.org/)
+- [Tutorial oficial de Python en Español](https://docs.python.org/es/3/tutorial/index.html)
+- [Repo 30 días de Python](https://github.com/Asabeneh/30-Days-Of-Python)
+- [Juego Codédex para aprender Python](https://www.codedex.io/)
+- [Visual Studio Code](https://code.visualstudio.com/): El editor que estoy usando
+- [FastAPI](https://fastapi.tiangolo.com/es/): El framework para crear nuestra API Backend
+- [MongoDB](https://www.mongodb.com/): La base de datos que utiliza nuestro backend
+- [Render](https://render.com/): Para desplegar nuestra API en la nube
 
 ## Únete al campus de programación de la comunidad
 
@@ -169,10 +164,11 @@ No descarto añadir nuevas lecciones a futuro, pero creo que por el momento pued
 #### Te presento [mouredev pro](https://mouredev.pro), mi proyecto más importante para ayudarte a estudiar programación y desarrollo de software de manera diferente.
 
 > **¿Buscas un extra?** Aquí encontrarás este y otros cursos editados por lecciones individuales, para avanzar a tu ritmo y guardar el progreso. También dispondrás de ejercicios y correcciones, test para validar tus conocimientos, examen y certificado público de finalización, soporte, foro de estudiantes, reunionnes grupales, cursos exclusivos y mucho más.
-> 
+>
 > Entra en **[mouredev.pro](https://mouredev.pro)** y utiliza el cupón **"PYTHON"** con un 10% de descuento en tu primera suscripción.
 
 ## ![https://mouredev.com](https://raw.githubusercontent.com/mouredev/mouredev/master/mouredev_emote.png) Hola, mi nombre es Brais Moure.
+
 ### Freelance full-stack iOS & Android engineer
 
 [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCxPD7bsocoAMq8Dj18kmGyQ?style=social)](https://youtube.com/mouredevapps?sub_confirmation=1)

From 724f9779184ee9a5ce0ff57bed37508c9d5e9002 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 09:27:34 +0200
Subject: [PATCH 17/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/{FastAPI => }/requirements.txt |  1 +
 Backend/vercel.json                    | 14 ++++++++++++++
 README.md                              |  4 ++--
 3 files changed, 17 insertions(+), 2 deletions(-)
 rename Backend/{FastAPI => }/requirements.txt (93%)
 create mode 100644 Backend/vercel.json

diff --git a/Backend/FastAPI/requirements.txt b/Backend/requirements.txt
similarity index 93%
rename from Backend/FastAPI/requirements.txt
rename to Backend/requirements.txt
index 8ab5160..7605290 100644
--- a/Backend/FastAPI/requirements.txt
+++ b/Backend/requirements.txt
@@ -1,5 +1,6 @@
 # Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=27335
 fastapi
+uvicorn
 python-jose
 passlib
 bcrypt
diff --git a/Backend/vercel.json b/Backend/vercel.json
new file mode 100644
index 0000000..1a01666
--- /dev/null
+++ b/Backend/vercel.json
@@ -0,0 +1,14 @@
+{
+    "builds": [
+        {
+            "src": "FastAPI/main.py",
+            "use": "@vercel/python"
+        }
+    ],
+    "routes": [
+        {
+            "src": "/(.*)",
+            "dest": "FastAPI/main.py"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 193dcdc..53c099a 100644
--- a/README.md
+++ b/README.md
@@ -92,7 +92,7 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 - [Lección 18 - Despliegue en Deta \*](https://youtu.be/_y9qQZXE24A?t=27335)
 - [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
-**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/) y utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados, como [Render](https://render.com/).
+**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el fichero de configuración para hacerlo desde [Vercel](https://vercel.com/).
 
 ### Frontend desde cero
 
@@ -155,7 +155,7 @@ No descarto añadir nuevas lecciones a futuro, pero creo que por el momento pued
 - [Visual Studio Code](https://code.visualstudio.com/): El editor que estoy usando
 - [FastAPI](https://fastapi.tiangolo.com/es/): El framework para crear nuestra API Backend
 - [MongoDB](https://www.mongodb.com/): La base de datos que utiliza nuestro backend
-- [Render](https://render.com/): Para desplegar nuestra API en la nube
+- [Vercel](https://vercel.com/): Para desplegar nuestra API en la nube
 
 ## Únete al campus de programación de la comunidad
 

From 1d35b0aa46d6e1448abe865dde7889e8faf0651b Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 09:45:05 +0200
Subject: [PATCH 18/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/main.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Backend/FastAPI/main.py b/Backend/FastAPI/main.py
index 09d72fa..afe7fbc 100644
--- a/Backend/FastAPI/main.py
+++ b/Backend/FastAPI/main.py
@@ -7,7 +7,7 @@
 # Instala FastAPI: pip install "fastapi[all]"
 
 from fastapi import FastAPI
-from routers import products, users, basic_auth_users, jwt_auth_users, users_db
+from .routers import products, users, basic_auth_users, jwt_auth_users, users_db
 from fastapi.staticfiles import StaticFiles
 
 app = FastAPI()

From 499300d39b402c64bbb502f847519f435be74c93 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 09:49:33 +0200
Subject: [PATCH 19/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/routers/basic_auth_users.py |  8 +++++---
 Backend/FastAPI/routers/jwt_auth_users.py   | 11 ++++++-----
 Backend/FastAPI/routers/products.py         | 11 ++++++-----
 Backend/FastAPI/routers/users_db.py         |  8 +++++---
 4 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/Backend/FastAPI/routers/basic_auth_users.py b/Backend/FastAPI/routers/basic_auth_users.py
index 21b65fa..da1b0f2 100644
--- a/Backend/FastAPI/routers/basic_auth_users.py
+++ b/Backend/FastAPI/routers/basic_auth_users.py
@@ -6,9 +6,11 @@
 from pydantic import BaseModel
 from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
 
-router = APIRouter(prefix="/basicauth",
-                   tags=["basicauth"],
-                   responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}})
+router = APIRouter(
+    prefix="/basicauth",
+    tags=["basicauth"],
+    responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}}
+)
 
 oauth2 = OAuth2PasswordBearer(tokenUrl="login")
 
diff --git a/Backend/FastAPI/routers/jwt_auth_users.py b/Backend/FastAPI/routers/jwt_auth_users.py
index 8cb57b3..dd26688 100644
--- a/Backend/FastAPI/routers/jwt_auth_users.py
+++ b/Backend/FastAPI/routers/jwt_auth_users.py
@@ -7,16 +7,17 @@
 from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
 from jose import jwt, JWTError
 from passlib.context import CryptContext
-from datetime import datetime, timedelta
-import timezone
+from datetime import datetime, timedelta, timezone
 
 ALGORITHM = "HS256"
 ACCESS_TOKEN_DURATION = 1
 SECRET = "201d573bd7d1344d3a3bfce1550b69102fd11be3db6d379508b6cccc58ea230b"
 
-router = APIRouter(prefix="/jwtauth",
-                   tags=["jwtauth"],
-                   responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}})
+router = APIRouter(
+    prefix="/jwtauth",
+    tags=["jwtauth"],
+    responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}}
+)
 
 oauth2 = OAuth2PasswordBearer(tokenUrl="login")
 
diff --git a/Backend/FastAPI/routers/products.py b/Backend/FastAPI/routers/products.py
index 6d85b33..4562224 100644
--- a/Backend/FastAPI/routers/products.py
+++ b/Backend/FastAPI/routers/products.py
@@ -4,12 +4,13 @@
 
 from fastapi import APIRouter
 
-router = APIRouter(prefix="/products",
-                   tags=["products"],
-                   responses={404: {"message": "No encontrado"}})
+router = APIRouter(
+    prefix="/products",
+    tags=["products"],
+    responses={404: {"message": "No encontrado"}}
+)
 
-products_list = ["Producto 1", "Producto 2",
-                 "Producto 3", "Producto 4", "Producto 5"]
+products_list = ["Producto 1", "Producto 2", "Producto 3", "Producto 4", "Producto 5"]
 
 
 @router.get("/")
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 7e61d75..7cdf6ff 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -8,9 +8,11 @@
 from db.client import db_client
 from bson import ObjectId
 
-router = APIRouter(prefix="/userdb",
-                   tags=["userdb"],
-                   responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}})
+router = APIRouter(
+    prefix="/userdb",
+    tags=["userdb"],
+    responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}}
+)
 
 
 @router.get("/", response_model=list[User])

From 75afa14822d0abe12320e3cf25a708035e6c2b94 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 09:53:58 +0200
Subject: [PATCH 20/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/routers/users_db.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 7cdf6ff..332a6af 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -3,9 +3,9 @@
 ### Users DB API ###
 
 from fastapi import APIRouter, HTTPException, status
-from db.models.user import User
-from db.schemas.user import user_schema, users_schema
-from db.client import db_client
+from ..db.models.user import User
+from ..db.schemas.user import user_schema, users_schema
+from ..db.client import db_client
 from bson import ObjectId
 
 router = APIRouter(

From eae102500208afc3c0e16e74ba77fb092a2e3c15 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 10:02:13 +0200
Subject: [PATCH 21/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/main.py             | 3 ++-
 Backend/FastAPI/routers/users_db.py | 6 +++---
 Backend/vercel.json                 | 4 ++--
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/Backend/FastAPI/main.py b/Backend/FastAPI/main.py
index afe7fbc..c8ba083 100644
--- a/Backend/FastAPI/main.py
+++ b/Backend/FastAPI/main.py
@@ -7,8 +7,9 @@
 # Instala FastAPI: pip install "fastapi[all]"
 
 from fastapi import FastAPI
-from .routers import products, users, basic_auth_users, jwt_auth_users, users_db
+from routers import products, users, basic_auth_users, jwt_auth_users, users_db
 from fastapi.staticfiles import StaticFiles
+import os
 
 app = FastAPI()
 
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 332a6af..7cdf6ff 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -3,9 +3,9 @@
 ### Users DB API ###
 
 from fastapi import APIRouter, HTTPException, status
-from ..db.models.user import User
-from ..db.schemas.user import user_schema, users_schema
-from ..db.client import db_client
+from db.models.user import User
+from db.schemas.user import user_schema, users_schema
+from db.client import db_client
 from bson import ObjectId
 
 router = APIRouter(
diff --git a/Backend/vercel.json b/Backend/vercel.json
index 1a01666..7cd0d44 100644
--- a/Backend/vercel.json
+++ b/Backend/vercel.json
@@ -1,14 +1,14 @@
 {
     "builds": [
         {
-            "src": "FastAPI/main.py",
+            "src": "Backend/FastAPI/main.py",
             "use": "@vercel/python"
         }
     ],
     "routes": [
         {
             "src": "/(.*)",
-            "dest": "FastAPI/main.py"
+            "dest": "Backend/FastAPI/main.py"
         }
     ]
 }
\ No newline at end of file

From a116e759ca97b5982a3ee7e23c1ec12328ac145e Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 10:08:08 +0200
Subject: [PATCH 22/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/main.py             | 6 ++++--
 Backend/FastAPI/routers/users_db.py | 9 ++++-----
 Backend/vercel.json                 | 4 ++--
 3 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/Backend/FastAPI/main.py b/Backend/FastAPI/main.py
index c8ba083..39b3e6e 100644
--- a/Backend/FastAPI/main.py
+++ b/Backend/FastAPI/main.py
@@ -7,7 +7,7 @@
 # Instala FastAPI: pip install "fastapi[all]"
 
 from fastapi import FastAPI
-from routers import products, users, basic_auth_users, jwt_auth_users, users_db
+from .routers import products, users, basic_auth_users, jwt_auth_users, users_db
 from fastapi.staticfiles import StaticFiles
 import os
 
@@ -27,7 +27,9 @@
 app.include_router(users_db.router)
 
 # Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=13618
-app.mount("/static", StaticFiles(directory="static"), name="static")
+# Nos aseguramos de obtener la ruta completa al directorio "static"
+static_dir = os.path.join(os.path.dirname(__file__), "static")
+app.mount("/static", StaticFiles(directory=static_dir), name="static")
 
 
 # Url local: http://127.0.0.1:8000
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 7cdf6ff..7a53d6f 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -3,16 +3,15 @@
 ### Users DB API ###
 
 from fastapi import APIRouter, HTTPException, status
-from db.models.user import User
-from db.schemas.user import user_schema, users_schema
-from db.client import db_client
+from ..db.models.user import User
+from ..db.schemas.user import user_schema, users_schema
+from ..db.client import db_client
 from bson import ObjectId
 
 router = APIRouter(
     prefix="/userdb",
     tags=["userdb"],
-    responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}}
-)
+    responses={status.HTTP_404_NOT_FOUND: {"message": "No encontrado"}})
 
 
 @router.get("/", response_model=list[User])
diff --git a/Backend/vercel.json b/Backend/vercel.json
index 7cd0d44..1a01666 100644
--- a/Backend/vercel.json
+++ b/Backend/vercel.json
@@ -1,14 +1,14 @@
 {
     "builds": [
         {
-            "src": "Backend/FastAPI/main.py",
+            "src": "FastAPI/main.py",
             "use": "@vercel/python"
         }
     ],
     "routes": [
         {
             "src": "/(.*)",
-            "dest": "Backend/FastAPI/main.py"
+            "dest": "FastAPI/main.py"
         }
     ]
 }
\ No newline at end of file

From 737df37f2104f830afa5cf850f7d039e67ba0396 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 10:29:50 +0200
Subject: [PATCH 23/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/main.py             | 3 ++-
 Backend/FastAPI/routers/users_db.py | 1 +
 README.md                           | 2 +-
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/Backend/FastAPI/main.py b/Backend/FastAPI/main.py
index 39b3e6e..8774f26 100644
--- a/Backend/FastAPI/main.py
+++ b/Backend/FastAPI/main.py
@@ -7,6 +7,7 @@
 # Instala FastAPI: pip install "fastapi[all]"
 
 from fastapi import FastAPI
+# Utilizo .routers para hacer referencia a la ruta relativa (y así no tener problemas en el despliegue)
 from .routers import products, users, basic_auth_users, jwt_auth_users, users_db
 from fastapi.staticfiles import StaticFiles
 import os
@@ -27,7 +28,7 @@
 app.include_router(users_db.router)
 
 # Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=13618
-# Nos aseguramos de obtener la ruta completa al directorio "static"
+# Nos aseguramos de obtener la ruta completa al directorio "static" (y así no tener problemas en el despliegue)
 static_dir = os.path.join(os.path.dirname(__file__), "static")
 app.mount("/static", StaticFiles(directory=static_dir), name="static")
 
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 7a53d6f..447b482 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -3,6 +3,7 @@
 ### Users DB API ###
 
 from fastapi import APIRouter, HTTPException, status
+# Utilizo ..db para hacer referencia a la ruta relativa (y así no tener problemas en el despliegue)
 from ..db.models.user import User
 from ..db.schemas.user import user_schema, users_schema
 from ..db.client import db_client
diff --git a/README.md b/README.md
index 53c099a..19c16bc 100644
--- a/README.md
+++ b/README.md
@@ -92,7 +92,7 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 - [Lección 18 - Despliegue en Deta \*](https://youtu.be/_y9qQZXE24A?t=27335)
 - [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
-**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el fichero de configuración para hacerlo desde [Vercel](https://vercel.com/).
+**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el [fichero de configuración](./Backend/vercel.json) para hacerlo desde [Vercel](https://vercel.com/) (al crear el proyecto en la plataforma selecciona que el directorio "Backend" es la root).
 
 ### Frontend desde cero
 

From 8df253770e674e7bf5aa601fe6f5684e5a4be90d Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 10:46:25 +0200
Subject: [PATCH 24/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/main.py                | 7 ++-----
 Backend/{ => FastAPI}/requirements.txt | 0
 Backend/FastAPI/routers/users_db.py    | 7 +++----
 Backend/{ => FastAPI}/vercel.json      | 4 ++--
 4 files changed, 7 insertions(+), 11 deletions(-)
 rename Backend/{ => FastAPI}/requirements.txt (100%)
 rename Backend/{ => FastAPI}/vercel.json (66%)

diff --git a/Backend/FastAPI/main.py b/Backend/FastAPI/main.py
index 8774f26..c8ba083 100644
--- a/Backend/FastAPI/main.py
+++ b/Backend/FastAPI/main.py
@@ -7,8 +7,7 @@
 # Instala FastAPI: pip install "fastapi[all]"
 
 from fastapi import FastAPI
-# Utilizo .routers para hacer referencia a la ruta relativa (y así no tener problemas en el despliegue)
-from .routers import products, users, basic_auth_users, jwt_auth_users, users_db
+from routers import products, users, basic_auth_users, jwt_auth_users, users_db
 from fastapi.staticfiles import StaticFiles
 import os
 
@@ -28,9 +27,7 @@
 app.include_router(users_db.router)
 
 # Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=13618
-# Nos aseguramos de obtener la ruta completa al directorio "static" (y así no tener problemas en el despliegue)
-static_dir = os.path.join(os.path.dirname(__file__), "static")
-app.mount("/static", StaticFiles(directory=static_dir), name="static")
+app.mount("/static", StaticFiles(directory="static"), name="static")
 
 
 # Url local: http://127.0.0.1:8000
diff --git a/Backend/requirements.txt b/Backend/FastAPI/requirements.txt
similarity index 100%
rename from Backend/requirements.txt
rename to Backend/FastAPI/requirements.txt
diff --git a/Backend/FastAPI/routers/users_db.py b/Backend/FastAPI/routers/users_db.py
index 447b482..1b5645f 100644
--- a/Backend/FastAPI/routers/users_db.py
+++ b/Backend/FastAPI/routers/users_db.py
@@ -3,10 +3,9 @@
 ### Users DB API ###
 
 from fastapi import APIRouter, HTTPException, status
-# Utilizo ..db para hacer referencia a la ruta relativa (y así no tener problemas en el despliegue)
-from ..db.models.user import User
-from ..db.schemas.user import user_schema, users_schema
-from ..db.client import db_client
+from db.models.user import User
+from db.schemas.user import user_schema, users_schema
+from db.client import db_client
 from bson import ObjectId
 
 router = APIRouter(
diff --git a/Backend/vercel.json b/Backend/FastAPI/vercel.json
similarity index 66%
rename from Backend/vercel.json
rename to Backend/FastAPI/vercel.json
index 1a01666..10bc3cd 100644
--- a/Backend/vercel.json
+++ b/Backend/FastAPI/vercel.json
@@ -1,14 +1,14 @@
 {
     "builds": [
         {
-            "src": "FastAPI/main.py",
+            "src": "main.py",
             "use": "@vercel/python"
         }
     ],
     "routes": [
         {
             "src": "/(.*)",
-            "dest": "FastAPI/main.py"
+            "dest": "main.py"
         }
     ]
 }
\ No newline at end of file

From c7f7f780a6bef45ddc2639d09ed143a833589f9f Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 10:51:50 +0200
Subject: [PATCH 25/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 19c16bc..1e0acde 100644
--- a/README.md
+++ b/README.md
@@ -92,7 +92,7 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 - [Lección 18 - Despliegue en Deta \*](https://youtu.be/_y9qQZXE24A?t=27335)
 - [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
-**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el [fichero de configuración](./Backend/vercel.json) para hacerlo desde [Vercel](https://vercel.com/) (al crear el proyecto en la plataforma selecciona que el directorio "Backend" es la root).
+**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el [fichero de configuración](./Backend/FastAPI/vercel.json) para hacerlo desde [Vercel](https://vercel.com/) (al crear el proyecto en la plataforma selecciona que el directorio "Backend/FastAPI" es el root).
 
 ### Frontend desde cero
 

From 6e66a60ade7e2dc3e7245880de229006778dacd7 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 11:07:24 +0200
Subject: [PATCH 26/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 1e0acde..c423682 100644
--- a/README.md
+++ b/README.md
@@ -92,7 +92,7 @@ Curso en el que aprenderemos a utilizar Python para backend e implementaremos un
 - [Lección 18 - Despliegue en Deta \*](https://youtu.be/_y9qQZXE24A?t=27335)
 - [Próximos pasos](https://youtu.be/_y9qQZXE24A?t=28484)
 
-**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el [fichero de configuración](./Backend/FastAPI/vercel.json) para hacerlo desde [Vercel](https://vercel.com/) (al crear el proyecto en la plataforma selecciona que el directorio "Backend/FastAPI" es el root).
+**\*ACTUALIZACIÓN Sobre la lección 18:** Deta, el servicio utilizado para el despliegue durante el curso, ya no existe. Te recomiendo revisar la documentación oficial de FastAPI sobre [despliegue](https://fastapi.tiangolo.com/deployment/). Puedes utilizar alguno de los [proveedores gratuitos](https://fastapi.tiangolo.com/deployment/cloud/) recomendados. En mi caso, te dejo el [fichero de configuración](./Backend/FastAPI/vercel.json) y el de [dependencias](./Backend/FastAPI/requirements.txt) para hacerlo desde [Vercel](https://vercel.com/) (al crear el proyecto en la plataforma selecciona que el directorio "Backend/FastAPI" es el root).
 
 ### Frontend desde cero
 

From 20e4c14bf7b5ac9e3b8bcac2bf8afa0a190dabdf Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 11:37:22 +0200
Subject: [PATCH 27/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/db/client.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/Backend/FastAPI/db/client.py b/Backend/FastAPI/db/client.py
index bfccb67..d92a361 100644
--- a/Backend/FastAPI/db/client.py
+++ b/Backend/FastAPI/db/client.py
@@ -22,5 +22,10 @@
 #     "mongodb+srv://<user>:<password>@<url>/?retryWrites=true&w=majority").test
 
 # Despliegue API en la nube:
-# Deta - https://www.deta.sh/
-# Intrucciones - https://fastapi.tiangolo.com/deployment/deta/
+# Deta (deprecado) - https://www.deta.sh/
+# Vercel - https://www.vercel.com
+# Instrucciones - https://cleverzone.medium.com/fastapi-deployment-into-vercel-0fa4e6478014
+# MUY IMPORTANTE - Al desplegar en producción, preparar el proyecto para trabajar con variables de entorno que hagan referencia a datos sensibles:
+# - Nunca subas a un repositorio público el valor de las variables
+# - Puedes usar dotenv en Python
+# - Añade el valor de las variables desde el proveedor de hosting

From 55e1bb457840762b6589ab50a66e605a2cea6457 Mon Sep 17 00:00:00 2001
From: Brais Moure <mouredev@gmail.com>
Date: Mon, 11 Aug 2025 13:59:58 +0200
Subject: [PATCH 28/28] =?UTF-8?q?Actualizaci=C3=B3n=20curso=20backend?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Backend/FastAPI/requirements.txt | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/Backend/FastAPI/requirements.txt b/Backend/FastAPI/requirements.txt
index 7605290..8fa41bc 100644
--- a/Backend/FastAPI/requirements.txt
+++ b/Backend/FastAPI/requirements.txt
@@ -1,8 +1,5 @@
-# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=27335
-fastapi
-uvicorn
+fastapi[standard]
 python-jose
 passlib
 bcrypt
-pymongo
-python-multipart
\ No newline at end of file
+pymongo
\ No newline at end of file
