Django en bref
Django est un framework web Python « batteries incluses » : ORM pour la base de données, système de gabarits, formulaires, authentification, interface d’administration, protections de sécurité… Il est utilisé pour des sites de contenu, des back-offices, des SaaS et des API. Ce cours utilise Django 6.1 (qui demande Python 3.12 ou plus récent) ; les notions présentées sont les mêmes dans la version à support long terme 5.2 LTS.
Créer un projet
python -m venv .venv && source .venv/bin/activate
python -m pip install Django # dernière version stable (6.1)
django-admin startproject config . # le point : crée le projet dans le dossier courant
python manage.py runserver # http://127.0.0.1:8000
Arborescence obtenue :
manage.py outil de commande du projet
config/
settings.py configuration (applications, base de données, langue...)
urls.py table des URL principale
wsgi.py, asgi.py points d'entrée pour les serveurs de production
Dans settings.py, passe LANGUAGE_CODE = "fr-fr" et TIME_ZONE = "Europe/Paris".
Créer une application
Un projet est un site ; une application est un module qui gère une fonctionnalité (catalogue, blog, comptes). Un projet en contient plusieurs.
python manage.py startapp catalogue
Puis déclare-la dans config/settings.py :
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
# ... applications fournies par Django ...
"catalogue", # notre application
]
Première vue
Une vue est une fonction qui reçoit une requête (HttpRequest) et renvoie une réponse (HttpResponse).
# catalogue/views.py
from django.http import HttpResponse
def accueil(request):
return HttpResponse("<h1>Bienvenue dans le catalogue</h1>")
def detail_produit(request, pk): # pk vient de l'URL, déjà converti en int
return HttpResponse(f"Produit n°{pk}")
Relier des URL aux vues
# catalogue/urls.py (fichier à créer)
from django.urls import path
from . import views
app_name = "catalogue" # espace de noms des URL de l'application
urlpatterns = [
path("", views.accueil, name="accueil"),
path("produits/<int:pk>/", views.detail_produit, name="detail"),
]
# config/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("catalogue/", include("catalogue.urls")), # délègue tout ce qui commence par catalogue/
]
<int:pk> est un convertisseur : il n’accepte que des chiffres et passe un int à la vue. Les autres : str (par défaut, tout sauf /), slug (lettres, chiffres, tirets, soulignés), uuid, path (accepte aussi les /). /catalogue/produits/abc/ ne correspond à aucun motif : Django renvoie 404.
Le paramètre name permet de générer les URL sans les écrire en dur : reverse("catalogue:detail", args=[3]) donne /catalogue/produits/3/.
Le parcours d’une requête
- Le navigateur demande
/catalogue/produits/3/. - Django parcourt
config/urls.pydans l’ordre, trouvecatalogue/, puis continue danscatalogue/urls.pyavecproduits/3/. - Le premier motif qui correspond gagne : Django appelle
detail_produit(request, pk=3). - La vue renvoie un
HttpResponse(souvent construit à partir d’un modèle et d’un gabarit).
C’est l’architecture MTV : le Modèle gère les données, le Template la présentation, la Vue la logique. L’aiguillage des URL est assuré par le framework.
À retenir
startprojectune fois,startapppar fonctionnalité, sans oublierINSTALLED_APPS.- Vue = fonction
request → HttpResponse. path()+ convertisseurs +name, etinclude()pour chaque application.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Résoudre une URL comme Django
Implémente le cœur du routage :
compiler(route)transforme une route comme"produits/<int:pk>/"en(regex compilée, conversions)en gérant<int:x>,<slug:x>,<str:x>,<path:x>et<x>(équivalent destr) ;resoudre(urlpatterns, chemin)reçoit une liste de(route, nom)et un chemin comme"/produits/3/", retire le/initial, teste les motifs dans l’ordre et renvoie(nom, kwargs)avec les valeurs converties, ouNone(404).
Motifs : int
[0-9]+, slug[-a-zA-Z0-9_]+, str[^/]+, path.+.import re CONVERTISSEURS = { "int": (r"[0-9]+", int), "slug": (r"[-a-zA-Z0-9_]+", str), "str": (r"[^/]+", str), "path": (r".+", str), } def compiler(route): ... def resoudre(urlpatterns, chemin): ...Créer le projet et l'application catalogue
Dans ton environnement de travail : crée un venv, installe Django (
python -m pip install Django), lancedjango-admin startproject config ., puispython manage.py startapp catalogue. Ajoute l’application àINSTALLED_APPS, créecatalogue/urls.pyavec les vuesaccueiletdetail_produit, inclus-le souscatalogue/dansconfig/urls.pyet lancepython manage.py runserver.- /catalogue/ affiche le message d'accueil
- /catalogue/produits/7/ affiche « Produit n°7 »
- /catalogue/produits/abc/ renvoie une page 404
- LANGUAGE_CODE vaut fr-fr et la page d'erreur de développement est en français
Projet ou application ?
Après
python manage.py startapp blog, que faut-il faire pour que Django prenne en compte les modèles deblog?- Rien, c'est automatique
- Ajouter "blog" à INSTALLED_APPS
- Relancer startproject
- Créer un fichier blog.py à la racine
Quiz de fin de leçon
Que reçoit et que renvoie une vue Django ?
- Un dict et une chaîne
- Un HttpRequest et un HttpResponse
- Une URL et un modèle
Que fait include(“catalogue.urls”) ?
- Copie les vues
- Délègue la suite de l'URL à l'URLconf de l'application
- Crée l'application
Quel convertisseur accepte « mon-article-2026 » mais pas « a/b » ?
- int
- slug
- path
La suite du cours
- Modèles et migrations18 min
- Interroger les données avec l'ORM18 min
- Vues et gabarits (templates)20 min
- Formulaires et interface d'administration20 min