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 a6b2a3a..0000000 Binary files a/Backend/FastAPI/__pycache__/main.cpython-310.pyc and /dev/null differ diff --git a/Backend/FastAPI/__pycache__/products.cpython-310.pyc b/Backend/FastAPI/__pycache__/products.cpython-310.pyc deleted file mode 100644 index 3dc8d32..0000000 Binary files a/Backend/FastAPI/__pycache__/products.cpython-310.pyc and /dev/null differ diff --git a/Backend/FastAPI/__pycache__/users.cpython-310.pyc b/Backend/FastAPI/__pycache__/users.cpython-310.pyc deleted file mode 100644 index 0d94f03..0000000 Binary files a/Backend/FastAPI/__pycache__/users.cpython-310.pyc and /dev/null differ 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 23a66f1..0000000 Binary files a/Backend/FastAPI/db/__pycache__/client.cpython-310.pyc and /dev/null differ diff --git a/Backend/FastAPI/db/client.py b/Backend/FastAPI/db/client.py index 498e15f..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 ### @@ -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: https://youtu.be/_y9qQZXE24A?t=25470 + +# Base de datos remota MongoDB Atlas (https://mongodb.com) +# db_client = MongoClient( +# "mongodb+srv://:@/?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 deleted file mode 100644 index 22edbcd..0000000 Binary files a/Backend/FastAPI/db/models/__pycache__/user.cpython-310.pyc and /dev/null differ diff --git a/Backend/FastAPI/db/models/user.py b/Backend/FastAPI/db/models/user.py index 75446ad..b26dc09 100644 --- a/Backend/FastAPI/db/models/user.py +++ b/Backend/FastAPI/db/models/user.py @@ -1,11 +1,12 @@ -# 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 ### 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 deleted file mode 100644 index 9137a54..0000000 Binary files a/Backend/FastAPI/db/schemas/__pycache__/user.cpython-310.pyc and /dev/null differ 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 new file mode 100644 index 0000000..8ab5160 --- /dev/null +++ b/Backend/FastAPI/requirements.txt @@ -0,0 +1,7 @@ +# Clase en vídeo: https://youtu.be/_y9qQZXE24A?t=27335 +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 deleted file mode 100644 index 3f26ee2..0000000 Binary files a/Backend/FastAPI/routers/__pycache__/basic_auth_users.cpython-310.pyc and /dev/null differ 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 2ffc14a..0000000 Binary files a/Backend/FastAPI/routers/__pycache__/jwt_auth_users.cpython-310.pyc and /dev/null differ 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 e41878c..0000000 Binary files a/Backend/FastAPI/routers/__pycache__/products.cpython-310.pyc and /dev/null differ 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 17f658e..0000000 Binary files a/Backend/FastAPI/routers/__pycache__/users.cpython-310.pyc and /dev/null differ 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 51e7707..0000000 Binary files a/Backend/FastAPI/routers/__pycache__/users_db.cpython-310.pyc and /dev/null differ diff --git a/Backend/FastAPI/routers/basic_auth_users.py b/Backend/FastAPI/routers/basic_auth_users.py index ad4562a..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 ### @@ -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..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 ### @@ -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/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 ce19817..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 ### @@ -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/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/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") 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: diff --git a/Images/header.jpg b/Images/header.jpg new file mode 100644 index 0000000..c5522dd Binary files /dev/null and b/Images/header.jpg differ diff --git a/Images/pro.jpg b/Images/pro.jpg new file mode 100644 index 0000000..986b770 Binary files /dev/null and b/Images/pro.jpg differ 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..3bf072b 100644 --- a/Intermediate/06_file_handling.py +++ b/Intermediate/06_file_handling.py @@ -10,33 +10,49 @@ # .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") -# 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 diff --git a/Intermediate/mypackage/__pycache__/__init__.cpython-310.pyc b/Intermediate/mypackage/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index e220697..0000000 Binary files a/Intermediate/mypackage/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/Intermediate/mypackage/__pycache__/arithmetics.cpython-310.pyc b/Intermediate/mypackage/__pycache__/arithmetics.cpython-310.pyc deleted file mode 100644 index 6e2cf79..0000000 Binary files a/Intermediate/mypackage/__pycache__/arithmetics.cpython-310.pyc and /dev/null differ diff --git a/README.md b/README.md index b1688d0..c93afa6 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,26 @@ # Hello Python -[![Python](https://img.shields.io/badge/Python-3.9+-yellow?style=for-the-badge&logo=python&logoColor=white&labelColor=101010)](https://python.org) +[![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://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.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 +![](./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! +## ¡NUEVO! Curso de Python para web -> --- -> 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)** +[![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web) -> 🗓 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. @@ -83,52 +68,109 @@ 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 + +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 + + + +* [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/). + +### 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. -* **¿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. + -* **¿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). + -* **¿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. +[![Curso Python Web](https://img.shields.io/github/stars/mouredev/python-web?label=Curso%20Python%20web&style=social)](https://github.com/mouredev/python-web) -* **¿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. + -* **¿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). +[![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) -* **¿Hasta dónde llegará el curso?** - * Mi idea es repasar los conceptos básicos hasta llegar a crear un backend (en principio). +### Aprende a integrar ChatGPT en tu proyecto desde cero -* **¿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. + ---- +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). + +### Traductor de Voz con IA + + + +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. + + + +### 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. + + + +## 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. + +* 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 -### 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! +## Únete al campus de programación de la comunidad -[![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/) +![https://mouredev.pro](./Images/pro.jpg) -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: +#### 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. -[![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) +> **¿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 @@ -140,8 +182,10 @@ 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 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) diff --git a/__pycache__/module.cpython-310.pyc b/__pycache__/module.cpython-310.pyc deleted file mode 100644 index 0d63bb6..0000000 Binary files a/__pycache__/module.cpython-310.pyc and /dev/null differ diff --git a/__pycache__/my_module.cpython-310.pyc b/__pycache__/my_module.cpython-310.pyc deleted file mode 100644 index ca5d74d..0000000 Binary files a/__pycache__/my_module.cpython-310.pyc and /dev/null differ