Django¶
Applications¶
core: main access point, handle shared codeqfdmo: handle map and acteurqfdmd: handle advise about circular economysearch: search enginedata: object used by the backoffice to handle datainfotri: info tri widgetstats: stats apidsfr-hacks: tooling to help about using DSFR
Django Tips¶
Use class-based views when appropriate
Prefer
LoginRequiredMixinfor protected viewsuse Mixin classes to handle shared behaviour
Use
prefetch_relatedandselect_relatedto optimize queries
Tâches asynchrones (django-tasks)¶
Certaines actions du back-office Django Admin — notamment l’application en masse de suggestions sur les SuggestionGroupe — peuvent traiter des milliers d’enregistrements. Pour éviter les timeouts HTTP, ces actions passent par django-tasks avec un backend PostgreSQL (django_tasks.backends.database.DatabaseBackend).
Architecture¶
Composant |
Rôle |
|---|---|
Tâches ( |
Fonctions décorées avec |
File d’attente |
Tables Django créées par |
Worker |
Processus dédié |
Processus web |
Gunicorn / |
Seuil synchrone / asynchrone¶
Les actions admin [SOURCE] Appliquer les suggestions au parent et [SOURCE] Appliquer les suggestions à la correction de l'acteur (webapp/data/admin.py) choisissent le mode d’exécution selon le nombre de SuggestionGroupe sélectionnés :
Sélection |
Comportement |
|---|---|
< 1 000 |
Exécution synchrone via |
≥ 1 000 |
Exécution asynchrone via |
Le seuil est défini par la constante SUGGESTION_TASK_ASYNC_THRESHOLD dans webapp/data/admin.py.
Développement local¶
Depuis webapp/ :
make runserver
La cible runserver du Makefile lance db_worker en arrière-plan puis runserver. Sans worker, les actions asynchrones (≥ 1 000 entrées) resteraient en file d’attente.
Pour lancer le worker seul (par exemple après un runserver démarré autrement) :
uv run python manage.py db_worker
Les tests utilisent le backend ImmediateBackend (webapp/settings/test.py) : les tâches s’exécutent inline, sans worker.
Production (Scalingo)¶
Le Procfile (racine du monorepo) déclare deux types de processus :
web: bash bin/start
worker: bash -c 'cd webapp && python manage.py db_worker'
postdeploy: bash bin/post_deploy
Scalingo démarre un container worker distinct du container web. Les deux partagent la même DATABASE_URL : le web enqueue, le worker consomme.
Voir aussi infrastructure/provisioning.md pour le détail du déploiement.
Ajouter une nouvelle tâche¶
Déclarer la fonction dans le module
tasks.pyde l’app concernée avec@task().Passer des identifiants sérialisables (listes d’IDs, pas de queryset) : la tâche peut s’exécuter dans un autre processus et doit re-fetcher les objets.
Depuis une vue ou une action admin, appeler
.call(...)pour une exécution synchrone ou.enqueue(...)pour la mettre en file.Tester avec
ImmediateBackend; vérifier localement avecdb_workersi la tâche est destinée à être enqueueée.