{"title":"L’infrastructure des tâches dans Django","version":"6.0","locale":"fr","docname":"topics/tasks","url":"/fr/6.0/topics/tasks/","canonical":"https://djangodocs.dev/fr/6.0/topics/tasks/","summary":"New in Django 6.0 Pour des versions plus anciennes de Django, le rétroportage django-tasks est disponible. Pour une application web, il y a souvent du code à…","html":"<h1>L’infrastructure des tâches dans Django<a class=\"heading-anchor\" href=\"#django-s-tasks-framework\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"6.0\">\n<p class=\"version-note-title\">New in Django 6.0</p><p>Pour des versions plus anciennes de Django, le rétroportage <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-tasks/\">django-tasks</a> est disponible.</p>\n</aside>\n<p>Pour une application web, il y a souvent du code à exécuter en plus du processus de transformation des requêtes HTTP en réponses HTTP. Pour certaines fonctionnalités, il peut être avantageux d’exécuter du code en dehors du cycle de requête-réponse.</p>\n<p>C’est là qu’entrent en jeu les tâches d’arrière-plan.</p>\n<p>Les tâches d’arrière-plan peuvent décharger le cycle de requête-réponse pour exécuter du code en dehors de ce cycle, potentiellement à une date ultérieure. Cela permet de garder les requêtes rapides, de réduire la latence et d’amélioration le ressenti des utilisateurs. Par exemple, une utilisatrice ne devrait pas avoir besoin d’attendre qu’un courriel soit envoyé avant que sa page termine de charger.</p>\n<p>L’infrastructure des tâches de Django facilite la définition et la mise en file d’attente de ce genre de travail. Mais elle ne fournit pas de mécanisme d’exécution de ces tâches. L’exécution réelle doit être gérée par une infrastructure extérieure à Django, telle qu’un processus ou service séparé. À ce titre, un <a class=\"reference internal\" href=\"#configuring-a-task-backend\"><span class=\"std std-ref\">moteur de tâches</span></a> capable de les exécuter sur ce service externe doit être choisi et configuré.</p>\n<section id=\"background-task-fundamentals\">\n<h2>Notions de base sur les tâches d’arrière-plan<a class=\"heading-anchor\" href=\"#background-task-fundamentals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque du code doit être exécuté en arrière-plan, Django crée une tâche <code class=\"docutils literal notranslate\"><span class=\"pre\">Task</span></code>, qui est stockée dans une file d’attente. Cette tâche contient toutes les métadonnées utiles à son exécution, de même qu’un identifiant unique pour que Django puisse plus tard obtenir son résultat.</p>\n<p>Un processus de travail ira piocher de nouvelles tâches à exécuter dans la file d’attente. Lorsqu’une nouvelle tâches est ajoutée, le processus réserve la tâche, l’exécute, et enregistre son statut et son résultat dans la file d’attente. Ces processus s’exécutent en dehors du cycle de requête-réponse.</p>\n</section>\n<section id=\"configuring-a-task-backend\">\n<span id=\"id1\"></span><h2>Configuration d’un moteur de tâches<a class=\"heading-anchor\" href=\"#configuring-a-task-backend\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le moteur de tâches détermine comment et où les tâches sont stockées en vue de leur exécution et comment elles sont exécutées. Différents moteurs de tâches possèdent différentes caractéristiques et options de configuration, ce qui peut influer sur la performance et la fiabilité de votre application. Django est livré avec des <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#task-available-backends\"><span class=\"std std-ref\">moteurs intégrés</span></a>, mais ceux-ci sont uniquement pour du développement ou des tests.</p>\n<p>Django gère la définition des tâches, leur validation, mise en file d’attente, et gestion de leurs résultats, pas leur exécution, donc les configurations de production ont besoin d’un moteur ou d’un processus de lancement qui exécute réellement ce qui se trouve en attente. Les options possibles sont énumérées sur la page <a class=\"reference external\" href=\"https://www.djangoproject.com/community/ecosystem/\">Community Ecosystem</a>.</p>\n<p>Les moteurs de tâches sont configurés par le réglage <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-TASKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TASKS</span></code></a> de votre fichier de réglages. Même si la majorité des applications n’auront besoin que d’un seul moteur, il est possible d’en avoir plusieurs.</p>\n<section id=\"immediate-execution\">\n<span id=\"immediate-task-backend\"></span><h3>Exécution immédiate<a class=\"heading-anchor\" href=\"#immediate-execution\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il s’agit du moteur par défaut si aucun autre n’a été indiqué dans le fichier des réglages. Ce moteur <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.immediate.ImmediateBackend\" title=\"django.tasks.backends.immediate.ImmediateBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImmediateBackend</span></code></a> exécute immédiatement les tâches en file d’attente, au lieu de le faire en arrière-plan. Cela permet notamment d’ajouter progressivement la fonctionnalité des tâches à une application, avant que l’infrastructure nécessaire ne soit mise en place.</p>\n<p>Pour l’utiliser, définissez <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-TASKS-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.tasks.backends.immediate.ImmediateBackend&quot;</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">TASKS</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.tasks.backends.immediate.ImmediateBackend&quot;</span><span class=\"p\">}}</span>\n</code></pre></div>\n<p>Le moteur <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.immediate.ImmediateBackend\" title=\"django.tasks.backends.immediate.ImmediateBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImmediateBackend</span></code></a> peut aussi être utile pour les tests, afin d’éviter d’avoir à exécuter un processus d’exécution externe au lancement des tests.</p>\n</section>\n<section id=\"dummy-backend\">\n<span id=\"dummy-task-backend\"></span><h3>Le moteur bidon<a class=\"heading-anchor\" href=\"#dummy-backend\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le moteur <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.dummy.DummyBackend\" title=\"django.tasks.backends.dummy.DummyBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DummyBackend</span></code></a> n’exécute pas du tout les tâches en liste d’attente, elle ne fait que stocker leur résultat en vue d’une utilisation ultérieure. Ces résultats de tâches restent toujours dans l’état  <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResultStatus.READY\" title=\"django.tasks.TaskResultStatus.READY\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">READY</span></code></a> (prête).</p>\n<p>Ce moteur n’est pas conçu pour être utilisé en production, il n’est fourni que par commodité et destiné à être utilisé durant le développement et les tests.</p>\n<p>Pour l’utiliser, définissez <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-TASKS-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.tasks.backends.dummy.DummyBackend&quot;</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">TASKS</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.tasks.backends.dummy.DummyBackend&quot;</span><span class=\"p\">}}</span>\n</code></pre></div>\n<p>Les résultats des tâches en file d’attente peuvent être obtenus à partir de l’attribut <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.dummy.DummyBackend.results\" title=\"django.tasks.backends.dummy.DummyBackend.results\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">results</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">default_task_backend</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">my_task</span><span class=\"o\">.</span><span class=\"n\">enqueue</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">default_task_backend</span><span class=\"o\">.</span><span class=\"n\">results</span><span class=\"p\">)</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>Les résultats stockés peuvent être effacés en utilisant la méthode <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.dummy.DummyBackend.clear\" title=\"django.tasks.backends.dummy.DummyBackend.clear\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clear()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">default_task_backend</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">default_task_backend</span><span class=\"o\">.</span><span class=\"n\">results</span><span class=\"p\">)</span>\n<span class=\"go\">0</span>\n</code></pre></div>\n</section>\n<section id=\"third-party-backends\">\n<h3>Moteurs de tierce partie<a class=\"heading-anchor\" href=\"#third-party-backends\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As mentioned at the beginning of this section, Django includes backends\nsuitable for development and testing only. Production systems should rely on\nbackends that supply a worker process and a durable queue implementation.\nAvailable third-party backends are listed on the <a class=\"reference external\" href=\"https://www.djangoproject.com/community/ecosystem/#tasks\">Community Ecosystem page</a> and the <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/task-framework/\">Tasks\nframework grid from Django Packages</a>.</p>\n<p>Pour utiliser un moteur de tâches externe avec Django, indiquez son chemin d’importation Python dans la clé setting:BACKEND &lt;TASKS-BACKEND&gt; du réglage setting:TASKS, comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">TASKS</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;path.to.backend&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Un moteur de tâches est une classe héritant de <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.base.BaseTaskBackend\" title=\"django.tasks.backends.base.BaseTaskBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseTaskBackend</span></code></a>. Au minimum, elle doit implémenter <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.base.BaseTaskBackend.enqueue\" title=\"django.tasks.backends.base.BaseTaskBackend.enqueue\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">BaseTaskBackend.enqueue()</span></code></a>. Si vous construisez votre propre moteur, vous pouvez utiliser les moteurs de tâches intégrés comme référence d’implémentation. Vous trouverez le code dans le répertoire <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/tasks/backends/\">django/tasks/backends/</a> du code source de Django.</p>\n</section>\n<section id=\"asynchronous-support\">\n<h3>Gestion du code asynchrone<a class=\"heading-anchor\" href=\"#asynchronous-support\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La prise en charge des moteurs de tâches asynchrones est en développement.</p>\n<p><a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.backends.base.BaseTaskBackend\" title=\"django.tasks.backends.base.BaseTaskBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseTaskBackend</span></code></a> possède des variantes asnychrones de toutes les méthodes de base. Par convention, les versions asynchrones de toutes les méthodes sont préfixées par <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code>. Les arguments des deux variantes sont identiques.</p>\n</section>\n<section id=\"retrieving-backends\">\n<h3>Obtention des moteurs<a class=\"heading-anchor\" href=\"#retrieving-backends\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les moteurs peuvent être obtenus en utilisant le gestionnaire de connexion <code class=\"docutils literal notranslate\"><span class=\"pre\">task_backends</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">task_backends</span>\n\n<span class=\"n\">task_backends</span><span class=\"p\">[</span><span class=\"s2\">&quot;default&quot;</span><span class=\"p\">]</span>  <span class=\"c1\"># The default backend</span>\n<span class=\"n\">task_backends</span><span class=\"p\">[</span><span class=\"s2\">&quot;reserve&quot;</span><span class=\"p\">]</span>  <span class=\"c1\"># Another backend</span>\n</code></pre></div>\n<p>Le moteur par défaut est disponible en tant que <code class=\"docutils literal notranslate\"><span class=\"pre\">default_task_backend</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">default_task_backend</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"defining-tasks\">\n<span id=\"id2\"></span><h2>Définition des tâches<a class=\"heading-anchor\" href=\"#defining-tasks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les tâches sont définies en utilisant le décorateur <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.task\" title=\"django.tasks.task\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.tasks.task()</span></code></a> sur une fonction au niveau d’un module :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">task</span>\n\n\n<span class=\"nd\">@task</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">email_users</span><span class=\"p\">(</span><span class=\"n\">emails</span><span class=\"p\">,</span> <span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">send_mail</span><span class=\"p\">(</span>\n        <span class=\"n\">subject</span><span class=\"o\">=</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recipient_list</span><span class=\"o\">=</span><span class=\"n\">emails</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>La valeur renvoyée par le décorateur est une instance <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task\" title=\"django.tasks.Task\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Task</span></code></a>.</p>\n<p>Les attributs de <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task\" title=\"django.tasks.Task\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Task</span></code></a> peuvent être personnalisés via les paramètres du décorateur <code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;task</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">task</span>\n\n\n<span class=\"nd\">@task</span><span class=\"p\">(</span><span class=\"n\">priority</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">queue_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;emails&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">email_users</span><span class=\"p\">(</span><span class=\"n\">emails</span><span class=\"p\">,</span> <span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">send_mail</span><span class=\"p\">(</span>\n        <span class=\"n\">subject</span><span class=\"o\">=</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recipient_list</span><span class=\"o\">=</span><span class=\"n\">emails</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>Par convention, les tâches sont définies dans un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">tasks.py</span></code>, mais ceci n’est pas obligatoire.</p>\n<section id=\"task-context\">\n<span id=\"id3\"></span><h3>Contexte des tâches<a class=\"heading-anchor\" href=\"#task-context\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Parfois, la tâche à exécuter peut avoir besoin de connaître le contexte dans lequel elle a été mise en file d’attente, et comment elle est exécutée. Elle peut pour cela accepter un argument <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> qui est une instance de <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskContext\" title=\"django.tasks.TaskContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TaskContext</span></code></a>.</p>\n<p>Pour recevoir le contexte de la tâche comme argument d’une fonction de tâche, passez <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> au moment de sa définition :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">logging</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">task</span>\n\n<span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@task</span><span class=\"p\">(</span><span class=\"n\">takes_context</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">email_users</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">,</span> <span class=\"n\">emails</span><span class=\"p\">,</span> <span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">):</span>\n    <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n        <span class=\"sa\">f</span><span class=\"s2\">&quot;Attempt </span><span class=\"si\">{</span><span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">attempt</span><span class=\"si\">}</span><span class=\"s2\"> to send user email. Task result id: </span><span class=\"si\">{</span><span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">task_result</span><span class=\"o\">.</span><span class=\"n\">id</span><span class=\"si\">}</span><span class=\"s2\">.&quot;</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">send_mail</span><span class=\"p\">(</span>\n        <span class=\"n\">subject</span><span class=\"o\">=</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"n\">from_email</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recipient_list</span><span class=\"o\">=</span><span class=\"n\">emails</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"modifying-tasks\">\n<span id=\"id4\"></span><h3>Modification des tâches<a class=\"heading-anchor\" href=\"#modifying-tasks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Avant de mettre une tâche en file d’attente, il peut être nécessaire de modifier certains paramètres de la tâche. Par exemple, pour lui donner une priorité plus haute que la normale.</p>\n<p>Une instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Task</span></code> ne peut pas être modifiée directement. Mais on peut par contre créer une instance modifiée avec la méthode <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.using\" title=\"django.tasks.Task.using\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">using()</span></code></a>, l’originale restant intacte. Par exemple :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">email_users</span><span class=\"o\">.</span><span class=\"n\">priority</span>\n<span class=\"go\">0</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">email_users</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">priority</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">priority</span>\n<span class=\"go\">10</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"enqueueing-tasks\">\n<span id=\"id5\"></span><h2>Mise en file d’attente des tâches<a class=\"heading-anchor\" href=\"#enqueueing-tasks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour ajouter une tâche dans le stockage de la file d’attente en vue de son exécution, appelez la méthode <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.enqueue\" title=\"django.tasks.Task.enqueue\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">enqueue()</span></code></a> sur elle. Si la tâche accepte des arguments, ils peuvent être transmis tels quels. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">email_users</span><span class=\"o\">.</span><span class=\"n\">enqueue</span><span class=\"p\">(</span>\n    <span class=\"n\">emails</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;user@example.com&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">subject</span><span class=\"o\">=</span><span class=\"s2\">&quot;You have a message&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"s2\">&quot;Hello there!&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Cela renvoie un objet <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResult\" title=\"django.tasks.TaskResult\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TaskResult</span></code></a>, qui peut être utilisé ensuite pour récupérer le résultat de la tâche après qu’elle a terminé son exécution.</p>\n<p>Pour mettre en file d’attente des tâches dans un contexte asynchrone, <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.aenqueue\" title=\"django.tasks.Task.aenqueue\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">aenqueue()</span></code></a> est disponible comme variante <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span></code> de <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.enqueue\" title=\"django.tasks.Task.enqueue\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">enqueue()</span></code></a>.</p>\n<p>Comme les arguments et les valeurs de renvoi des tâches sont toutes sérialisées en JSON, elles doivent pouvoir être sérialisées en JSON :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">process_data</span><span class=\"o\">.</span><span class=\"n\">enqueue</span><span class=\"p\">(</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">TypeError</span>: <span class=\"n\">Object of type datetime is not JSON serializable</span>\n</code></pre></div>\n<p>Les arguments doivent aussi être capable de faire un cycle aller-retour par <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#json.dumps\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">json.dumps()</span></code></a>/ <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#json.loads\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">json.loads()</span></code></a> sans changer de type. Par exemple, considérez cette tâche :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@task</span><span class=\"p\">()</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">double_dictionary</span><span class=\"p\">(</span><span class=\"n\">key</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"n\">key</span><span class=\"p\">:</span> <span class=\"n\">key</span> <span class=\"o\">*</span> <span class=\"mi\">2</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Si le moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">ImmediateBackend</span></code> a été configuré comme moteur par défaut :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">double_dictionary</span><span class=\"o\">.</span><span class=\"n\">enqueue</span><span class=\"p\">((</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">status</span>\n<span class=\"go\">FAILED</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">traceback</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">TypeError</span>: <span class=\"n\">unhashable type: &#39;list&#39;</span>\n</code></pre></div>\n<p>La tâche <code class=\"docutils literal notranslate\"><span class=\"pre\">double_dictionary</span></code> échoue parce qu’après l’aller-retour JSON, le tuple <code class=\"docutils literal notranslate\"><span class=\"pre\">(1,</span> <span class=\"pre\">2,</span> <span class=\"pre\">3)</span></code> devient la liste <code class=\"docutils literal notranslate\"><span class=\"pre\">[1,</span> <span class=\"pre\">2,</span> <span class=\"pre\">3]</span></code>, qui ne peut pas être utilisée comme clé de dictionnaire.</p>\n<p>En général, les objets complexes tels que des instances de modèles ou des types Python comme <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">tuple</span></code> ne peuvent pas être utilisés dans le système des tâches sans une conversion spécifique.</p>\n<section id=\"transactions\">\n<span id=\"task-transactions\"></span><h3>Transactions<a class=\"heading-anchor\" href=\"#transactions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pour la plupart des moteurs, les tâches sont exécutées dans un processus séparé, utilisant une connexion de base de données différente. Lorsqu’on utilise une transaction, sans attendre que celle-ci soit commitée, des processus d’exécution pourraient démarrer le traitement d’une tâche utilisant des objets auxquels elle ne peut pas encore accéder.</p>\n<p>Par exemple, considérons cet exemple simplifié :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@task</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_task</span><span class=\"p\">(</span><span class=\"n\">thing_num</span><span class=\"p\">):</span>\n    <span class=\"n\">Thing</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">num</span><span class=\"o\">=</span><span class=\"n\">thing_num</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n    <span class=\"n\">Thing</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">my_task</span><span class=\"o\">.</span><span class=\"n\">enqueue</span><span class=\"p\">(</span><span class=\"n\">thing_num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour éviter le scénario où <code class=\"docutils literal notranslate\"><span class=\"pre\">my_task</span></code> s’exécute avant que <code class=\"docutils literal notranslate\"><span class=\"pre\">Thing</span></code> ne soit commité dans la base de données, utilisez <a class=\"reference internal\" href=\"/fr/6.0/topics/db/transactions/#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">transaction.on_commit()</span></code></a>, en liant tous les arguments à destination de <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.enqueue\" title=\"django.tasks.Task.enqueue\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">enqueue()</span></code></a> via <a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.partial\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">functools.partial()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">functools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">partial</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n<span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n    <span class=\"n\">Thing</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">partial</span><span class=\"p\">(</span><span class=\"n\">my_task</span><span class=\"o\">.</span><span class=\"n\">enqueue</span><span class=\"p\">,</span> <span class=\"n\">thing_num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"task-results\">\n<span id=\"id6\"></span><h2>Résultats des tâches<a class=\"heading-anchor\" href=\"#task-results\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lors de la mise en file d’attente d’une tâche <code class=\"docutils literal notranslate\"><span class=\"pre\">Task</span></code>, vous obtenez une instance <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResult\" title=\"django.tasks.TaskResult\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TaskResult</span></code></a>. Cette instance permet ensuite de récupérer le résultat de la tâche depuis un autre endroit (par exemple une autre requête ou une autre tâche).</p>\n<p>Chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">TaskResult</span></code> possède un <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResult.id\" title=\"django.tasks.TaskResult.id\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">id</span></code></a> unique, qui peut être utilisé ensuite pour récupérer le résultat une fois que le code qui a mis la tâche en file d’attente ait terminé son travail.</p>\n<p>La méthode <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.get_result\" title=\"django.tasks.Task.get_result\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_result()</span></code></a> peut récupérer un résultat sur la base de son <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Later, somewhere else...</span>\n<span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">email_users</span><span class=\"o\">.</span><span class=\"n\">get_result</span><span class=\"p\">(</span><span class=\"n\">result_id</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour obtenir un résultat <code class=\"docutils literal notranslate\"><span class=\"pre\">TaskResult</span></code>, quel que soit le type de tâche dont il provient, utilisez la méthode <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.get_result\" title=\"django.tasks.Task.get_result\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_result()</span></code></a> sur le moteur :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.tasks</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">default_task_backend</span>\n\n<span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">default_task_backend</span><span class=\"o\">.</span><span class=\"n\">get_result</span><span class=\"p\">(</span><span class=\"n\">result_id</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Pour récupérer des résultats dans un contexte asynchrone, <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.aget_result\" title=\"django.tasks.Task.aget_result\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">aget_result()</span></code></a> est disponible comme variante <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span></code> de <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.get_result\" title=\"django.tasks.Task.get_result\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_result()</span></code></a>, aussi bien pour le moteur que pour une tâche <code class=\"docutils literal notranslate\"><span class=\"pre\">Task</span></code>.</p>\n<p>Certains moteurs, tels que le moteur intégré <code class=\"docutils literal notranslate\"><span class=\"pre\">ImmediateBackend</span></code>, ne prennent pas en charge <code class=\"docutils literal notranslate\"><span class=\"pre\">get_result()</span></code>. Si on appelle cette méthode avec ces moteurs, une erreur <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#NotImplementedError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotImplementedError</span></code></a> sera générée.</p>\n<section id=\"updating-results\">\n<h3>Mise à jour des résultats<a class=\"heading-anchor\" href=\"#updating-results\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">TaskResult</span></code> contient l’état d’exécution d’une tâche au moment où il est obtenu. Si la tâche se termine après que <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.Task.get_result\" title=\"django.tasks.Task.get_result\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_result()</span></code></a> est appelée, l’objet ne se met pas à jour tout seul.</p>\n<p>Pour actualiser les valeurs, appelez la méthode <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResult.refresh\" title=\"django.tasks.TaskResult.refresh\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.tasks.TaskResult.refresh()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">status</span>\n<span class=\"go\">RUNNING</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">refresh</span><span class=\"p\">()</span>  <span class=\"c1\"># or await result.arefresh()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">status</span>\n<span class=\"go\">SUCCESSFUL</span>\n</code></pre></div>\n</section>\n<section id=\"return-values\">\n<span id=\"task-return-values\"></span><h3>Valeurs de renvoi<a class=\"heading-anchor\" href=\"#return-values\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si votre fonction de tâche renvoie quelque chose, on peut le récupérer à partir de l’attribut <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResult.return_value\" title=\"django.tasks.TaskResult.return_value\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.tasks.TaskResult.return_value</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">status</span>\n<span class=\"go\">SUCCESSFUL</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">return_value</span>\n<span class=\"go\">42</span>\n</code></pre></div>\n<p>Si la tâche n’a pas terminé son exécution, ou qu’elle a échoué, une exception <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></a> est générée.</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">status</span>\n<span class=\"go\">RUNNING</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">return_value</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValueError</span>: <span class=\"n\">Task has not finished yet</span>\n</code></pre></div>\n</section>\n<section id=\"errors\">\n<h3>Erreurs<a class=\"heading-anchor\" href=\"#errors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si la tâche échoue et produit une exception, soit dans le contexte de la tâche ou lors de son exécution, l’exception et la trace d’erreur sont enregistrés dans la liste <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskResult.errors\" title=\"django.tasks.TaskResult.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.tasks.TaskResult.errors</span></code></a>.</p>\n<p>Chaque élément de <code class=\"docutils literal notranslate\"><span class=\"pre\">errors</span></code> est un objet <a class=\"reference internal\" href=\"/fr/6.0/ref/tasks/#django.tasks.TaskError\" title=\"django.tasks.TaskError\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TaskError</span></code></a> contenant des informations au sujet de l’erreur produite durant l’exécution :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">exception_class</span>\n<span class=\"go\">&lt;class &#39;ValueError&#39;&gt;</span>\n</code></pre></div>\n<p>Notez qu’il ne s’agit que du type de l’exception et ne contient pas d’autres valeurs. Les informations de trace d’erreur sont réduites à une chaîne qui peut être utile en vue du débogage :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">traceback</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">TypeError</span>: <span class=\"n\">Object of type datetime is not JSON serializable</span>\n</code></pre></div>\n</section>\n</section>","rootId":"django-s-tasks-framework","toc":[{"title":"Notions de base sur les tâches d’arrière-plan","anchor":"background-task-fundamentals","children":[]},{"title":"Configuration d’un moteur de tâches","anchor":"configuring-a-task-backend","children":[{"title":"Exécution immédiate","anchor":"immediate-execution","children":[]},{"title":"Le moteur bidon","anchor":"dummy-backend","children":[]},{"title":"Moteurs de tierce partie","anchor":"third-party-backends","children":[]},{"title":"Gestion du code asynchrone","anchor":"asynchronous-support","children":[]},{"title":"Obtention des moteurs","anchor":"retrieving-backends","children":[]}]},{"title":"Définition des tâches","anchor":"defining-tasks","children":[{"title":"Contexte des tâches","anchor":"task-context","children":[]},{"title":"Modification des tâches","anchor":"modifying-tasks","children":[]}]},{"title":"Mise en file d’attente des tâches","anchor":"enqueueing-tasks","children":[{"title":"Transactions","anchor":"transactions","children":[]}]},{"title":"Résultats des tâches","anchor":"task-results","children":[{"title":"Mise à jour des résultats","anchor":"updating-results","children":[]},{"title":"Valeurs de renvoi","anchor":"return-values","children":[]},{"title":"Erreurs","anchor":"errors","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/6.0/topics/"}],"prev":{"docname":"topics/async","title":"Gestion du code asynchrone","url":"/fr/6.0/topics/async/"},"next":{"docname":"howto/index","title":"Guides pratiques","url":"/fr/6.0/howto/"},"formats":{"html":"/fr/6.0/topics/tasks/","markdown":"/fr/6.0/topics/tasks.md","json":"/fr/6.0/topics/tasks.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/tasks.txt","official":"https://docs.djangoproject.com/fr/6.0/topics/tasks/","inVersions":["6.1","6.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}