Formation Python Complète
Formation Python Complète
FORMATION
PYTHON
COMPLÈTE & PROFESSIONNELLE
# Chapitre Thème
Python est aujourd'hui le langage de programmation le plus populaire au monde. Créé par Guido van Rossum en
1991, il est connu pour sa lisibilité, sa simplicité et sa puissance. Que tu veuilles faire du web, de l'intelligence
artificielle, de la cybersécurité ou de l'automatisation — Python est là.
Avantage Explication
Sur Windows :
# 1. Va sur [Link]
# 2. Télécharge Python 3.12+
# 3. IMPORTANT: Coche 'Add Python to PATH'
# 4. Vérifie dans le terminal:
python --version
# Output: Python 3.12.x
# Ubuntu / Debian
sudo apt update && sudo apt install python3 python3-pip
# Vérification
python3 --version
■■ INFO
Installe VS Code comme éditeur de code (gratuit). Ajoute l'extension 'Python' par
Microsoft. C'est ton environnement de travail principal.
La tradition veut que le premier programme affiche 'Hello, World!'. C'est ton baptême de codeur !
# Output:
# Hello, World!
# Je suis en train de devenir un expert Python !
■ CONSEIL
La fonction print() affiche du texte à l'écran. C'est ton meilleur ami pour déboguer
et tester.
Une variable est une boîte dans laquelle tu stockes une valeur. En Python, pas besoin de déclarer le type — Python
le devine tout seul (c'est ce qu'on appelle le typage dynamique).
age = 25
print(type(age)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type('Alice')) # <class 'str'>
print(type(True)) # <class 'bool'>
+ Addition : 5+3=8
- Soustraction : 10 - 4 = 6
* Multiplication : 4 * 7 = 28
/ Division : 15 / 4 = 3.75
// Division entière: 15 // 4 = 3
% Modulo (reste) : 15 % 4 = 3
** Puissance : 2 ** 8 = 256
# Calculs courants
a, b = 10, 3
print(a + b) # 13
print(a - b) # 7
print(a * b) # 30
print(a / b) # 3.3333...
print(a // b) # 3 (partie entière)
print(a % b) # 1 (reste)
print(a ** b) # 1000 (10 puissance 3)
Les strings sont fondamentales en Python. Apprends à les manipuler comme un chef !
# Vérifications
print('Python' in phrase) # True
print([Link]('Python')) # True
print([Link]('génial')) # True
■ EXPERT
Les f-strings (f'...') sont la façon MODERNE d'insérer des variables dans du texte.
Utilise toujours cette syntaxe, elle est plus lisible et plus rapide.
# Raccourci:
age = int(input('Quel est ton âge ? '))
# Exemple complet:
nom = input('Ton nom : ')
annee_naissance = int(input('Année de naissance : '))
age = 2025 - annee_naissance
print(f'{nom}, tu as environ {age} ans.')
■■ Exercices du Chapitre 1
• • Exercice 1 : Crée un programme qui demande le prénom, le nom et l'âge de l'utilisateur, puis affiche une
phrase de présentation.
• • Exercice 2 : Crée une calculatrice simple qui demande deux nombres et affiche leur somme, différence, produit
et quotient.
• • Exercice 3 : Demande le rayon d'un cercle et calcule son aire (PI * r²) et son périmètre (2 * PI * r).
• • Exercice 4 : Prends une phrase et affiche : sa longueur, en majuscules, en minuscules, et si elle contient le
mot 'Python'.
■ EXPERT
Ne recopie pas les solutions. Essaie par toi-même, fais des erreurs, cherche pourquoi
ça ne marche pas. C'est comme ça qu'on apprend vraiment.
Une liste est une collection ordonnée et modifiable d'éléments. C'est l'une des structures les plus utilisées en
Python.
# Modifier
fruits[0] = 'fraise'
print(fruits) # ['fraise', 'banane', 'cerise', 'mangue']
# Ajouter
[Link]('kiwi') # ajoute à la fin
[Link](1, 'raisin') # insère en position 1
# Supprimer
[Link]('banane') # supprime par valeur
dernier = [Link]() # supprime et retourne le dernier
del fruits[0] # supprime par index
# Infos
print(len(fruits)) # nombre d'éléments
print('kiwi' in fruits) # True/False
print([Link]('pomme'))# nombre d'occurrences
Opérations avancées :
# Trier
[Link]() # tri en place: [1,1,2,3,4,5,6,9]
[Link](reverse=True) # décroissant
tries = sorted(nombres) # retourne une nouvelle liste
# Inverser
[Link]()
# Concaténer
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b # [1,2,3,4,5,6]
[Link](b) # modifie a directement
# Copier (IMPORTANT!)
copie = [Link]() # vraie copie indépendante
# PAS: copie = a (ce serait juste un alias!)
■■ ATTENTION
Ne fais JAMAIS liste2 = liste1 pour copier une liste. Tu aurais deux variables
pointant vers le MÊME objet. Utilise liste2 = [Link]().
Un tuple est comme une liste IMMUABLE — on ne peut pas le modifier après création. Utilisé pour des données
constantes ou des retours multiples de fonctions.
# Créer un tuple
coordonnees = (48.8566, 2.3522) # Paris
couleurs_rgb = (255, 128, 0) # Orange
singleton = (42,) # tuple à 1 élément (virgule!)
# Créer un dictionnaire
personne = {
'nom': 'Alice',
'age': 28,
'ville': 'Lyon',
'actif': True
}
# Modifier / Ajouter
personne['age'] = 29 # modifier
personne['email'] = 'a@[Link]' # ajouter
# Supprimer
del personne['actif']
email = [Link]('email') # supprime et retourne
# Parcourir
for cle, valeur in [Link]():
print(f'{cle}: {valeur}')
# Clés et valeurs
print(list([Link]())) # ['nom', 'age', 'ville']
print(list([Link]())) # ['Alice', 29, 'Lyon']
# Vérifier l'existence
print('nom' in personne) # True
etudiants = {
'Alice': {'note': 18, 'matiere': 'Python'},
'Bob': {'note': 15, 'matiere': 'JavaScript'},
'Eve': {'note': 20, 'matiere': 'Python'},
}
# Ajouter un étudiant
etudiants['Charlie'] = {'note': 17, 'matiere': 'Rust'}
# Créer un set
fruits = {'pomme', 'banane', 'cerise', 'pomme'} # doublon ignoré
print(fruits) # {'pomme', 'banane', 'cerise'}
# Opérations ensemblistes
a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7}
■ EXPERT
Utilise un set quand tu dois vérifier souvent si un élément existe dans une
collection. C'est beaucoup plus rapide qu'une liste pour cette opération.
■■ Exercices du Chapitre 2
• • Exercice 1 : Crée une liste de 5 pays, trie-la alphabétiquement, ajoute un pays et supprime-en un.
• • Exercice 2 : Crée un dictionnaire 'carnet' avec 3 contacts (nom, téléphone, email). Ajoute, modifie et supprime
un contact.
• • Exercice 3 : Donne une liste avec des doublons [1,2,2,3,3,3,4,5,5] et affiche les valeurs uniques, leur nombre
et si le nombre 7 est présent.
• • Exercice 4 : Crée un dictionnaire de notes {'Alice':18, 'Bob':14, 'Eve':20} et calcule la moyenne, trouve le
meilleur et le moins bon.
age = 20
# Opérateurs de comparaison
# == égal != différent
# > supérieur >= supérieur ou égal
# < inférieur <= inférieur ou égal
# Opérateurs logiques
x = 15
if x > 10 and x < 20: # ET
print('x est entre 10 et 20')
■■ ATTENTION
L'indentation (4 espaces) est OBLIGATOIRE en Python. C'est elle qui délimite les
blocs de code. Si tu oublies d'indenter, ton programme plantera.
while True:
guess = int(input('Devine le nombre (1-100): '))
essais += 1
if guess < secret:
print('Trop petit!')
elif guess > secret:
print('Trop grand!')
else:
print(f'Bravo! Trouvé en {essais} essais!')
break # sort de la boucle
C'est une des fonctionnalités les plus élégantes de Python. Elle permet de créer des listes en une seule ligne.
# CLASSIQUE vs PYTHONIQUE
# Classique (verbeux):
carres = []
for i in range(10):
[Link](i ** 2)
# Avec condition
pairs = [i for i in range(20) if i % 2 == 0]
print(pairs) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# Transformation de strings
fruits = ['pomme', 'banane', 'cerise']
majusc = [[Link]() for f in fruits]
print(majusc) # ['POMME', 'BANANE', 'CERISE']
# Dict comprehension
noms = ['Alice', 'Bob', 'Eve']
scores = [18, 14, 20]
carnet = {nom: score for nom, score in zip(noms, scores)}
print(carnet) # {'Alice': 18, 'Bob': 14, 'Eve': 20}
# Set comprehension
uniques = {x**2 for x in [-3, -2, -1, 0, 1, 2, 3]}
print(uniques) # {0, 1, 4, 9}
■ EXPERT
Les list comprehensions sont la marque d'un développeur Python confirmé. Entraîne-toi
à les utiliser — elles rendent le code plus lisible et plus rapide.
■■ Exercices du Chapitre 3
# Syntaxe de base
def saluer(prenom):
message = f'Bonjour, {prenom} !'
return message
# Appel de la fonction
resultat = saluer('Alice')
print(resultat) # Bonjour, Alice !
print(addition(1, 2)) # 3
print(addition(1, 2, 3, 4)) # 10
print(addition(10, 20, 30)) # 60
# Combinaison
def super_fonction(*args, **kwargs):
print('Args:', args)
print('Kwargs:', kwargs)
Les lambdas sont des fonctions anonymes en une seule ligne. Utilisées souvent avec map(), filter() et sorted().
# Lambda simple
carre = lambda x: x ** 2
print(carre(5)) # 25
double = lambda x: x * 2
add = lambda x, y: x + y
# Module datetime
from datetime import datetime, date
maintenant = [Link]()
print([Link]('%d/%m/%Y %H:%M'))
# Module os
import os
print([Link]()) # répertoire courant
print([Link]('.')) # liste les fichiers
[Link]('mon_dossier', exist_ok=True)
# Fichier: [Link]
def addition(a, b):
return a + b
def aire_cercle(rayon):
import math
return [Link] * rayon ** 2
PI = 3.14159
# ==============================
# Dans un autre fichier: [Link]
import calculs
print([Link](5, 3)) # 8
print(calculs.aire_cercle(7)) # 153.93...
print([Link]) # 3.14159
# Ou avec from/import
from calculs import addition, aire_cercle
print(addition(10, 20)) # 30
ma_fonction()
# print(locale) # ERREUR! non accessible ici
# Variable GLOBALE
compteur = 0
def incrementer():
global compteur # déclare qu'on veut la globale
compteur += 1
incrementer()
incrementer()
print(compteur) # 2
■■ ATTENTION
Évite les variables globales autant que possible. Passe les valeurs en paramètres et
retourne les résultats. Ton code sera plus propre et testable.
La POO permet de modéliser le monde réel en créant des 'objets' qui regroupent données et comportements. C'est
le paradigme dominant dans l'industrie.
class Animal:
# Attribut de classe (partagé par tous)
royaume = 'Animalia'
# Méthode
def presenter(self):
return f'Je suis {[Link]}, un {[Link]} de {[Link]} ans.'
def anniversaire(self):
[Link] += 1
print(f'{[Link]} a maintenant {[Link]} ans!')
# Représentation string
def __str__(self):
return f'Animal({[Link]}, {[Link]})'
print([Link]())
[Link]()
print(rex) # Animal(Rex, Chien)
print([Link]) # Animalia
5.2 — Héritage
def __str__(self):
return f'{[Link]} ({self.vitesse_max} km/h max)'
def klaxonner(self):
print(f'{[Link]}: TUUUT!')
class Moto(Vehicule):
def __init__(self, marque, vitesse_max):
super().__init__(marque, vitesse_max)
def faire_wheelie(self):
if [Link] > 60:
print('WHEELIE!')
# Utilisation
ferrari = Voiture('Ferrari', 320, 2)
ducati = Moto('Ducati', 280)
[Link](100)
[Link]()
[Link](80)
ducati.faire_wheelie()
■■ INFO
super() appelle le constructeur de la classe parente. C'est essentiel quand tu fais
de l'héritage pour initialiser correctement tous les attributs.
v1 = Vecteur(3, 4)
v2 = Vecteur(1, 2)
print(v1) # Vecteur(3, 4)
print(v1 + v2) # Vecteur(4, 6)
print(v1 * 2) # Vecteur(6, 8)
print(len(v1)) # 5
# Écrire JSON
with open('[Link]', 'w') as f:
[Link](donnees, f, indent=2)
# Lire JSON
with open('[Link]', 'r') as f:
loaded = [Link](f)
print(loaded['nom']) # Alice
# Exceptions personnalisées
class AgeInvalideError(Exception):
def __init__(self, age):
[Link] = age
super().__init__(f'Age invalide: {age}. Doit etre entre 0 et 150.')
def valider_age(age):
if not 0 <= age <= 150:
raise AgeInvalideError(age)
return True
■ EXPERT
Sois précis dans tes except: attrap les exceptions spécifiques, pas juste 'except
Exception'. Cela aide à déboguer et à comprendre les vrais problèmes.
import os
# Navigation
print([Link]()) # répertoire courant
[Link]('/tmp') # changer de répertoire
# Fichiers et dossiers
[Link]('projet/src', exist_ok=True)
[Link]('[Link]', '[Link]')
[Link]('[Link]')
[Link]('dossier_vide')
# Variables d environnement
home = [Link]('HOME', '/home/user')
path = [Link]('PATH')
# Informations système
print([Link]) # 'nt' (Windows) ou 'posix' (Unix)
print([Link]) # '\\' ou '/'
# Chercher un pattern
texte = 'Mon email est alice@[Link] et bob@[Link]'
print(valider_tel('0612345678')) # True
print(valider_tel('123')) # False
# Remplacer du texte
texte = 'le prix est 19.99 euros et 45.50 euros'
resultat = [Link](r'\d+\.\d+', '[Link]', texte)
print(resultat) # 'le prix est [Link] euros et [Link] euros'
# Groupes de capture
date_str = '2025-03-15'
match = [Link](r'(\d{4})-(\d{2})-(\d{2})', date_str)
if match:
annee, mois, jour = [Link]()
print(f'Année: {annee}, Mois: {mois}, Jour: {jour}')
■■ INFO
Les expressions régulières semblent complexes au début. Utilise [Link] pour
tester tes patterns en temps réel. Avec de la pratique, ça devient naturel.
Flask est le framework web le plus simple pour démarrer. Parfait pour des APIs et des petites applications.
app = Flask(__name__)
# Route principale
@[Link]('/')
def accueil():
return '<h1>Bienvenue sur mon API Flask!</h1>'
if __name__ == '__main__':
[Link](debug=True, port=5000)
FastAPI est le framework de référence pour les APIs professionnelles. Il génère automatiquement la documentation
et valide les données.
class UtilisateurDB(Utilisateur):
id: int
db = []
@[Link]('/')
def accueil():
return {'message': 'Bienvenue sur mon API FastAPI!'}
@[Link]('/users', response_model=list[UtilisateurDB])
def lister_users():
return db
@[Link]('/users/{user_id}')
def get_user(user_id: int):
user = next((u for u in db if [Link] == user_id), None)
if not user:
raise HTTPException(status_code=404, detail='Non trouvé')
return user
■ EXPERT
FastAPI génère automatiquement une documentation interactive (Swagger UI) accessible
sur /docs. C'est un gain de temps énorme en développement d'API.
class Article([Link]):
titre = [Link](max_length=200)
contenu = [Link]()
date_pub = [Link](auto_now_add=True)
auteur = [Link](max_length=100)
publie = [Link](default=False)
def __str__(self):
return [Link]
class Meta:
ordering = ['-date_pub']
def liste_articles(request):
articles = [Link](publie=True)
return render(request, 'blog/[Link]', {'articles': articles})
# [Link]
from [Link] import path
from . import views
urlpatterns = [
path('', views.liste_articles, name='liste'),
path('<int:pk>/', views.detail_article, name='detail'),
]
Django Sites web complets, CMS, e-commerce Plus long Très bonne
import sqlite3
# Insertion multiple
utilisateurs = [
('Bob', 'bob@[Link]', 35),
('Eve', 'eve@[Link]', 24),
('Charlie','charlie@[Link]',30),
]
[Link](
'INSERT INTO utilisateurs (nom, email, age) VALUES (?, ?, ?)',
utilisateurs
)
[Link]() # Sauvegarder
# Mettre à jour
[Link](
'UPDATE utilisateurs SET age = ? WHERE nom = ?',
(29, 'Alice')
)
# Supprimer
[Link]('DELETE FROM utilisateurs WHERE nom = ?', ('Bob',))
[Link]()
[Link]()
# Connexion
engine = create_engine('sqlite:///[Link]', echo=False)
class Base(DeclarativeBase):
pass
# Modèle
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
nom = Column(String(100), nullable=False)
email = Column(String(200), unique=True)
age = Column(Integer)
actif = Column(Boolean, default=True)
def __repr__(self):
return f'User(id={[Link]}, nom={[Link]})'
# CRUD complet
with Session(engine) as session:
# CREATE
alice = User(nom='Alice', email='alice@[Link]', age=28)
[Link](alice)
[Link]()
# READ
users = [Link](User).filter([Link] > 20).all()
user = [Link](User).filter_by(nom='Alice').first()
# UPDATE
[Link] = 29
[Link]()
# DELETE
[Link](user)
[Link]()
# Statistiques
data = [Link](100, 15, 1000) # distribution normale
print(f'Moyenne: {[Link]():.2f}')
print(f'Ecart-type: {[Link]():.2f}')
print(f'Min: {[Link]():.2f}, Max: {[Link]():.2f}')
# Matrices
A = [Link]([[1, 2], [3, 4]])
B = [Link]([[5, 6], [7, 8]])
print(A @ B) # Multiplication matricielle
print([Link](A)) # Déterminant
# Créer un DataFrame
data = {
'Nom': ['Alice', 'Bob', 'Eve', 'Charlie', 'Dave'],
'Age': [28, 35, 24, 30, 27],
'Ville': ['Paris', 'Lyon', 'Marseille', 'Paris', 'Lyon'],
'Salaire':[45000, 55000, 38000, 60000, 42000],
}
df = [Link](data)
# Exploration
print([Link]()) # 5 premières lignes
print([Link]) # (5, 4)
print([Link]) # types des colonnes
print([Link]()) # statistiques
# Filtrer
parisiens = df[df['Ville'] == 'Paris']
seniors = df[df['Age'] > 30]
bien_payes = df[df['Salaire'] > 50000]
# Sélectionner colonnes
noms_ages = df[['Nom', 'Age']]
# Groupby
moy_par_ville = [Link]('Ville')['Salaire'].mean()
print(moy_par_ville)
# Trier
df_tries = df.sort_values('Salaire', ascending=False)
# Lire/Écrire CSV
df.to_csv('[Link]', index=False)
df2 = pd.read_csv('[Link]')
# Valeurs manquantes
[Link]() # supprimer les NaN
[Link](0) # remplacer NaN par 0
■ EXPERT
Pandas est la bibliothèque DATA la plus utilisée en Python. Si tu veux travailler
dans la data science ou l'analyse, maîtrise-la parfaitement.
# GET simple
response = [Link]('[Link]
print(response.status_code) # 200
data = [Link]()
print(f'Nom: {data["name"]}')
print(f'Repos: {data["public_repos"]}')
# Télécharger un fichier
url = '[Link]
r = [Link](url, stream=True)
with open('[Link]', 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
[Link](chunk)
■■ ATTENTION
Le scraping doit être éthique: vérifie le fichier [Link] du site, respecte les
délais entre requêtes, et n'utilise pas les données à des fins malveillantes.
# Démarrer le navigateur
driver = [Link]() # ou Firefox()
driver.maximize_window()
try:
# Naviguer
[Link]('[Link]
# Attendre et cliquer
wait = WebDriverWait(driver, 10)
search = [Link](EC.presence_of_element_located(
([Link], 'q')
))
search.send_keys('Python programmation')
search.send_keys([Link])
# Screenshot
driver.save_screenshot('[Link]')
finally:
[Link]() # TOUJOURS fermer!
■■ ATTENTION
IMPORTANT: Ces connaissances sont à utiliser UNIQUEMENT de façon éthique et légale:
CTF, bug bounty avec autorisation, tests sur tes propres systèmes. L'utilisation non
autorisée de ces techniques est un crime dans la plupart des pays. Be a White Hat,
not a Black Hat.
# Chiffrer
message = b'Message secret!'
chiffre = [Link](message)
print(f'Chiffré: {chiffre}')
# Déchiffrer
dechiffre = [Link](chiffre)
print(f'Déchiffré: {[Link]()}')
# SHA-256
h = hashlib.sha256([Link]()).hexdigest()
print(f'SHA256: {h}')
def analyser_mdp(mdp):
score = 0
retours = []
if [Link](r'[A-Z]', mdp):
score += 1
else:
[Link]('Ajoutez des majuscules')
if [Link](r'[0-9]', mdp):
score += 1
else:
[Link]('Ajoutez des chiffres')
if [Link](r'[!@#$%^&*(),.?":{}|<>]', mdp):
score += 2
else:
[Link]('Ajoutez des caractères spéciaux')
r = analyser_mdp('MonSuperMdp2025!')
print(f'Niveau: {r["niveau"]} ({r["score"]}/6)')
■■ INFO
Pour apprendre la cybersécurité éthiquement: HackTheBox, TryHackMe, PicoCTF sont
d'excellentes plateformes CTF légales où tu peux pratiquer librement.
import asyncio
import aiohttp # pip install aiohttp
import time
# Exemple pratique
async def main():
urls = [
'[Link]
'[Link]
'[Link]
]
debut = [Link]()
resultats = await fetch_all(urls)
fin = [Link]()
print(f'{len(resultats)} URLs récupérées en {fin-debut:.1f}s')
# ~1s au lieu de 3s!
[Link](main())
import pytest
# Fonction à tester
def diviser(a, b):
if b == 0:
raise ValueError('Division par zéro')
return a / b
# Tests
def test_division_normale():
assert diviser(10, 2) == 5.0
assert diviser(9, 3) == 3.0
def test_division_par_zero():
with [Link](ValueError):
diviser(10, 0)
def test_division_negatives():
assert diviser(-10, 2) == -5.0
assert diviser(10, -2) == -5.0
@[Link]('a,b,expected', [
(10, 2, 5.0),
(9, 3, 3.0),
(1, 4, 0.25),
])
def test_parametres(a, b, expected):
assert diviser(a, b) == expected
@[Link]()
def saluer(
nom: str = [Link](..., help='Ton prénom'),
fois: int = [Link](1, help='Combien de fois'),
upper: bool = [Link](False, help='En majuscules'),
):
'"""Salue quelqu un."""'
message = f'[bold green]Bonjour {nom}![/bold green]'
if upper:
message = [Link]()
for _ in range(fois):
print(message)
@[Link]()
def info():
'"""Affiche les infos système."""'
import platform, sys
print(f'[blue]Python:[/blue] {[Link]}')
print(f'[blue]OS:[/blue] {[Link]()} {[Link]()}')
if __name__ == '__main__':
app()
# Usage:
# python [Link] saluer Alice --fois 3
# python [Link] saluer ALICE --upper
# python [Link] --help
Application Complète de A à Z
Tu vas construire une API REST complète avec FastAPI + SQLAlchemy + tests automatisés. Ce projet regroupe
tout ce que tu as appris.
Architecture du projet :
todo_app/
■■■ [Link] # Point d'entrée FastAPI
■■■ [Link] # Modèles SQLAlchemy
■■■ [Link] # Schémas Pydantic
■■■ [Link] # Configuration DB
■■■ routers/
■ ■■■ [Link] # Routes des tâches
■ ■■■ [Link] # Routes des utilisateurs
■■■ tests/
■ ■■■ test_api.py # Tests automatisés
■■■ [Link]
[Link] :
DATABASE_URL = 'sqlite:///./[Link]'
engine = create_engine(DATABASE_URL, connect_args={'check_same_thread': False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
class Base(DeclarativeBase):
pass
def get_db():
db = SessionLocal()
try:
yield db
finally:
[Link]()
[Link] :
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
email = Column(String, unique=True, index=True)
nom = Column(String)
hashed_pwd = Column(String)
tasks = relationship('Task', back_populates='owner')
class Task(Base):
__tablename__ = 'tasks'
id = Column(Integer, primary_key=True, index=True)
titre = Column(String, index=True)
description = Column(String, nullable=True)
terminee = Column(Boolean, default=False)
priorite = Column(Integer, default=1) # 1=basse, 3=haute
created_at = Column(DateTime, default=[Link])
owner_id = Column(Integer, ForeignKey('[Link]'))
owner = relationship('User', back_populates='tasks')
[Link] :
[Link].create_all(bind=engine)
app = FastAPI(
title='To-Do API',
description='API de gestion de tâches',
version='1.0.0'
)
class TaskCreate(BaseModel):
titre: str
description: Optional[str] = None
priorite: int = 1
class TaskResponse(TaskCreate):
id: int
terminee: bool
class Config:
from_attributes = True
@[Link]('/tasks', response_model=list[TaskResponse])
def lister_taches(db: Session = Depends(get_db)):
return [Link](Task).all()
@[Link]('/tasks/{task_id}/done', response_model=TaskResponse)
def marquer_terminee(task_id: int, db: Session = Depends(get_db)):
task = [Link](Task).filter([Link] == task_id).first()
if not task:
raise HTTPException(status_code=404, detail='Tâche non trouvée')
[Link] = True
[Link]()
return task
@[Link]('/tasks/{task_id}', status_code=204)
def supprimer_tache(task_id: int, db: Session = Depends(get_db)):
task = [Link](Task).filter([Link] == task_id).first()
if not task:
raise HTTPException(status_code=404, detail='Tâche non trouvée')
[Link](task)
[Link]()
Objectifs Ressources
■ Ressources recommandées
■ Conseils du Formateur
■ EXPERT
Code CHAQUE JOUR, même 20 minutes. La régularité bat l'intensité. Un projet imparfait
terminé vaut mille projets parfaits abandonnés.
■ CONSEIL
Construis des projets RÉELS dès que possible. Crée un bot Discord, automatise une
tâche de ta vie quotidienne, scrape les prix d'un site. Apprends en faisant.
■■ INFO
Lis du code des autres. Explore les repos populaires sur GitHub. Voir comment les
experts structurent leur code t'apprendra plus qu'un livre.