{"title":"Tutoriel avancé : concevoir des applications réutilisables","version":"5.0","locale":"fr","docname":"intro/reusable-apps","url":"/fr/5.0/intro/reusable-apps/","canonical":"https://djangodocs.dev/fr/5.0/intro/reusable-apps/","summary":"Ce tutoriel avancé commence là où le tutoriel 8 s’est arrêté. Nous allons transformer notre application de sondage Web en un paquet Python autonome qu’il sera…","html":"<h1>Tutoriel avancé : concevoir des applications réutilisables<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce tutoriel avancé commence là où le <a class=\"reference internal\" href=\"/fr/5.0/intro/tutorial08/\"><span class=\"doc\">tutoriel 8</span></a> s’est arrêté. Nous allons transformer notre application de sondage Web en un paquet Python autonome qu’il sera possible de réutiliser dans de nouveaux projets et de partager avec d’autres personnes.</p>\n<p>Si vous n’avez pas récemment suivi les tutoriels 1–7, nous vous encourageons à les parcourir à nouveau afin que votre exemple de projet corresponde à celui qui est décrit ci-dessous.</p>\n<section id=\"reusability-matters\">\n<h2>Importance du recyclage<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>C’est un gros travail de concevoir, construire, tester et maintenir une application Web. Beaucoup de projets Python et Django ont des problématiques communes. Ne serait-il pas merveilleux si nous pouvions économiser un peu de ce travail répétitif ?</p>\n<p>Le recyclage de code est un principe de vie en Python. Le site <a class=\"reference external\" href=\"https://pypi.org/\">Python Package Index (PyPI)</a> recense une très large variété de paquets qu’il est possible d’utiliser dans ses propres programmes Python. Parcourez le site <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> pour trouver des applications réutilisables qu’il est possible d’intégrer dans votre projet. Django lui-même n’est qu’un paquet Python. Cela signifie que vous pouvez prendre des paquets Python ou des applications Django existantes et les composer dans votre propre projet Web. Vous n’avez plus qu’à écrire les parties qui font de votre projet un projet unique.</p>\n<p>Disons que vous débutez un nouveau projet qui nécessite une application de sondage telle que celle sur laquelle nous avons travaillé. Comme pouvez-vous recycler cette application ? Heureusement, vous êtes déjà sur la bonne voie. Dans le <a class=\"reference internal\" href=\"/fr/5.0/intro/tutorial01/\"><span class=\"doc\">tutoriel 1</span></a>, nous avons vu comment découpler les sondages de la configuration d’URL de base du projet en utilisant un <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code>. Dans ce tutoriel, nous irons un peu plus loin pour rendre l’application simple à utiliser dans de nouveaux projets et prête à être publiée pour que d’autres puissent l’installer et l’exploiter.</p>\n<aside class=\"admonition-package-app admonition\">\n<p class=\"admonition-title\">Paquet ? Application ?</p>\n<p>Un <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-term\">paquet</span></a> Python permet de regrouper du code Python pour qu’il puisse être facilement réutilisé. Un paquet contient un ou plusieurs fichiers de code Python (aussi connus sous le nom de « modules »).</p>\n<p>Un paquet peut être importé avec <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">foo.bar</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">foo</span> <span class=\"pre\">import</span> <span class=\"pre\">bar</span></code>. Pour qu’un répertoire (comme <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>) constitue un paquet, il doit contenir un fichier spécial <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code>, même si ce dernier est vide.</p>\n<p>Une <em>application</em> Django est un paquet Python qui est spécialement prévu pour fonctionner dans un projet Django. Une application peut utiliser des conventions Django partagées, comme la présence de sous-modules <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">urls</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">views</span></code>.</p>\n<p>Par la suite, nous utilisons le terme <em>empaquetage</em> (packaging) pour décrire le processus de création d’un paquet Python facile à installer par tout le monde. Cela peut prêter à confusion, effectivement.</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>Votre projet et votre application recyclable<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Après les tutoriels précédents, notre projet devrait ressembler à ceci :</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>mysite/\n    manage.py\n    mysite/\n        __init__.py\n        settings.py\n        urls.py\n        asgi.py\n        wsgi.py\n    polls/\n        __init__.py\n        admin.py\n        apps.py\n        migrations/\n            __init__.py\n            0001_initial.py\n        models.py\n        static/\n            polls/\n                images/\n                    background.png\n                style.css\n        templates/\n            polls/\n                detail.html\n                index.html\n                results.html\n        tests.py\n        urls.py\n        views.py\n    templates/\n        admin/\n            base_site.html\n</code></pre></div>\n<p>Vous avez créé <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/templates</span></code> dans le <a class=\"reference internal\" href=\"/fr/5.0/intro/tutorial07/\"><span class=\"doc\">tutoriel 7</span></a> et <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code> dans le <a class=\"reference internal\" href=\"/fr/5.0/intro/tutorial03/\"><span class=\"doc\">tutoriel 3</span></a>. Il est peut-être maintenant plus facile de comprendre pourquoi nous avons séparé les répertoires de gabarits du projet de ceux de l’application : tout ce qui fait partie de l’application de sondage se trouve dans <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>. L’application forme un tout par elle-même et est ainsi plus facile à intégrer dans un nouveau projet.</p>\n<p>Le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> pourrait maintenant être copié dans un nouveau projet Django pour être immédiatement utilisé. L’application n’est cependant pas encore tout à fait prête pour être publiée. Pour cela, il faut encore empaqueter l’application afin que d’autres puissent facilement l’installer.</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>Installation de quelques prérequis<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’état actuel de la construction de paquets Python est un peu embrouillé par l’utilisation de plusieurs outils. Dans ce tutoriel, nous allons utiliser <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> pour construire nos paquets. C’est l’outil d’empaquetage que nous recommandons (fusionné avec le dérivé <code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code>). Nous utiliserons aussi <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pip/\">pip</a> pour l’installer et le désinstaller. Vous devriez installer maintenant ces deux paquets. Si vous avez besoin d’aide, vous pouvez vous référer à <a class=\"reference internal\" href=\"/fr/5.0/topics/install/#installing-official-release\"><span class=\"std std-ref\">comment installer Django avec pip</span></a>. Vous pouvez installer <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> de la même manière.</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>Empaquetage de l’application<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L”<em>empaquetage</em> Python se réfère à la préparation d’une application dans un format spécifique qui peut être facilement installé et utilisé. Django lui-même est empaqueté de manière très semblable. Pour une petite application comme la nôtre, ce processus n’est pas trop difficile.</p>\n<ol class=\"arabic\">\n<li><p>Premièrement, créez un répertoire parent pour le paquet, en dehors de votre projet Django. Nommez ce répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\">\n<p class=\"admonition-title\">Choix d’un nom pour votre application</p>\n<p>Lors du choix d’un nom de paquet, vérifiez sur PyPI pour éviter des conflits de nommage avec des paquets existants. Nous recommandons d’utiliser un préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> pour les noms de paquets, pour clarifier le fait que votre paquet est spécifique à Django, ainsi qu’un préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">django_</span></code> pour le nom du module. Par exemple, le paquet <code class=\"docutils literal notranslate\"><span class=\"pre\">django-ratelimit</span></code> contient le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django_ratelimit</span></code>.</p>\n<p>Les étiquettes d’applications (c’est-à-dire la partie finale du chemin pointé vers le paquet de l’application) figurant dans <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> <em>doivent</em> être uniques. Évitez d’utiliser la même étiquette que l’une des <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/\"><span class=\"doc\">applications contribuées</span></a> de Django, par exemple <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code>.</p>\n</aside>\n</li>\n<li><p>Déplacez le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> et renommez-le en <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls</span></code>.</p></li>\n<li><p>Modifiez <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls/apps.py</span></code> afin que <a class=\"reference internal\" href=\"/fr/5.0/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">name</span></code></a> se réfère au nouveau nom de module et ajoutez <a class=\"reference internal\" href=\"/fr/5.0/ref/applications/#django.apps.AppConfig.label\" title=\"django.apps.AppConfig.label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label</span></code></a> pour donner un nom court à l’application :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/django_polls/apps.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AppConfig</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PollsConfig</span><span class=\"p\">(</span><span class=\"n\">AppConfig</span><span class=\"p\">):</span>\n    <span class=\"n\">default_auto_field</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.db.models.BigAutoField&quot;</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django_polls&quot;</span>\n    <span class=\"n\">label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;polls&quot;</span>\n</code></pre></figure>\n</li>\n<li><p>Créez un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code> contenant ceci :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"rst\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">============</span>\n<span class=\"gh\">django-polls</span>\n<span class=\"gh\">============</span>\n\ndjango-polls is a Django app to conduct web-based polls. For each\nquestion, visitors can choose between a fixed number of answers.\n\nDetailed documentation is in the &quot;docs&quot; directory.\n\n<span class=\"gh\">Quick start</span>\n<span class=\"gh\">-----------</span>\n\n<span class=\"m\">1.</span> Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n<span class=\"c\">        ...,</span>\n<span class=\"c\">        &quot;django_polls&quot;,</span>\n<span class=\"c\">    ]</span>\n\n<span class=\"m\">2.</span> Include the polls URLconf in your project urls.py like this::\n\n    path(&quot;polls/&quot;, include(&quot;django_polls.urls&quot;)),\n\n<span class=\"m\">3.</span> Run <span class=\"s\">``python manage.py migrate``</span> to create the models.\n\n<span class=\"m\">4.</span> Start the development server and visit the admin to create a poll.\n\n<span class=\"m\">5.</span> Visit the <span class=\"s\">``/polls/``</span> URL to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p>Créez un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/LICENSE</span></code>. Le choix d’une licence n’est pas dans le thème de ce tutoriel, mais nous vous rendons attentif au fait que du code publié sans licence est <em>inutile</em>. Django et de nombreuses applications compatibles Django sont distribués sous licence BSD ; vous êtes bien sûr libre d’utiliser la licence de votre choix. Sachez seulement que le choix de la licence a un impact sur la quantité d’utilisateurs potentiels de votre code.</p></li>\n<li><p>Ensuite, nous allons créer les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">pyproject.toml</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.cfg</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code> qui précisent la façon de construire et d’installer l’application. Nous ne nous lancerons pas dans une explication détaillée de ces fichiers, mais vous trouverez plus d’informations dans la <a class=\"reference external\" href=\"https://setuptools.pypa.io/en/latest/\">documentation de setuptools</a>. Créez les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/pyproject.toml</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.cfg</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code> avec le contenu suivant :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"toml\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/pyproject.toml</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Toml</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=\"Toml code\"><code><span class=\"k\">[build-system]</span>\n<span class=\"n\">requires</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s1\">&#39;setuptools&gt;=40.8.0&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">build-backend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;setuptools.build_meta&#39;</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.cfg</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</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=\"Ini code\"><code><span class=\"k\">[metadata]</span>\n<span class=\"na\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">django-polls</span>\n<span class=\"na\">version</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">0.1</span>\n<span class=\"na\">description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">A Django app to conduct web-based polls.</span>\n<span class=\"na\">long_description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">file: README.rst</span>\n<span class=\"na\">url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">https://www.example.com/</span>\n<span class=\"na\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">Your Name</span>\n<span class=\"na\">author_email</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">yourname@example.com</span>\n<span class=\"na\">license</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">BSD-3-Clause</span><span class=\"w\">  </span><span class=\"c1\"># Example license</span>\n<span class=\"na\">classifiers</span><span class=\"w\"> </span><span class=\"o\">=</span>\n<span class=\"w\">    </span><span class=\"na\">Environment</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Web Environment</span>\n<span class=\"w\">    </span><span class=\"na\">Framework</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Django</span>\n<span class=\"w\">    </span><span class=\"na\">Framework</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Django :: X.Y</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"w\">    </span><span class=\"na\">Intended Audience</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Developers</span>\n<span class=\"w\">    </span><span class=\"na\">License</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: OSI Approved :: BSD License</span>\n<span class=\"w\">    </span><span class=\"na\">Operating System</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: OS Independent</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3 :: Only</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.10</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.11</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.12</span>\n<span class=\"w\">    </span><span class=\"na\">Topic</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP</span>\n<span class=\"w\">    </span><span class=\"na\">Topic</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP :: Dynamic Content</span>\n\n<span class=\"k\">[options]</span>\n<span class=\"na\">include_package_data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">true</span>\n<span class=\"na\">packages</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">find:</span>\n<span class=\"na\">python_requires</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&gt;=3.10</span>\n<span class=\"na\">install_requires</span><span class=\"w\"> </span><span class=\"o\">=</span>\n<span class=\"w\">    </span><span class=\"na\">Django &gt;</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">X.Y</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">setuptools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">setup</span>\n\n<span class=\"n\">setup</span><span class=\"p\">()</span>\n</code></pre></figure>\n</li>\n<li><p>Seuls des modules et paquets Python sont inclus par défaut dans le paquet. Pour ajouter des fichiers supplémentaires, nous devrons créer un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code>. La documentation de <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> mentionnée à l’étape précédente présente ce fichier en détails. Pour inclure les gabarits et les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">README.rst</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">LICENSE</span></code>, créez un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> avec le contenu suivant :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>include LICENSE\ninclude README.rst\nrecursive-include django_polls/static *\nrecursive-include django_polls/templates *\n</code></pre></figure>\n</li>\n<li><p>Il est facultatif, mais recommandé, d’inclure de la documentation détaillée dans votre application. Créez un répertoire vide <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> en prévision de contenu documentaire. Ajoutez une ligne supplémentaire dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code>:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>recursive-include docs *\n</code></pre></div>\n<p>Notez que le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code> ne sera pas inclus dans votre paquet tant que vous n’y ajoutez pas de fichier. Beaucoup d’applications Django offrent aussi un version en ligne de leur documentation par le moyen de sites comme <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a>.</p>\n</li>\n<li><p>Essayez de construire votre paquet en exécutant <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">setup.py</span> <span class=\"pre\">sdist</span></code> depuis <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>. Cela va créer un répertoire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> et construire votre nouveau paquet, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls-0.1.tar.gz</span></code>.</p></li>\n</ol>\n<p>Pour plus d’informations sur l’empaquetage, consultez (en anglais) le <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutoriel sur l’empaquetage et la distribution de projets</a>.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>Utilisation de son propre paquet<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Comme nous avons déplacé le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> hors du projet, celui-ci ne fonctionne plus. Nous allons maintenant corriger ça en installant notre nouveau paquet <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\">\n<p class=\"admonition-title\">Installation en tant que bibliothèque utilisateur</p>\n<p>Les étapes suivantes installent <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> comme une bibliothèque utilisateur. Les installations « utilisateur » comportent bien des avantages sur l’installation de paquets au niveau système, comme de pouvoir être utilisables sur des systèmes dont vous n’êtes pas administrateur ou pour éviter que le paquet ne perturbe des services du système ou d’autres utilisateurs de la machine.</p>\n<p>Notez que les installations « utilisateur » peuvent tout de même influencer le comportement d’outils système qui tournent sous l’identité de cet utilisateur, il est donc plus robuste d’utiliser un environnement virtuel (voir ci-dessous).</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>Pour installer le paquet, utilisez pip (vous l’avez déjà <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">installé</span></a>, n’est-ce pas ?) :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>--user<span class=\"w\"> </span>django-polls/dist/django-polls-0.1.tar.gz\n</code></pre></div>\n</li>\n<li><p>Mettez à jour <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> pour pointer vers le nouveau nom de 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=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django_polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Mettez à jour <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</span></code> pour pointer vers le nouveau nom de 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=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django_polls.urls&quot;</span><span class=\"p\">)),</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Lancez le serveur de développement pour confirmer que le projet fonctionne toujours.</p></li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>Publication de l’application<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Après avoir empaqueté et testé <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>, il est prêt à être partagé avec le monde entier ! Si ce n’était pas qu’un exemple, vous pourriez maintenant :</p>\n<ul class=\"simple\">\n<li><p>Envoyer le paquet à un ami par courriel.</p></li>\n<li><p>Envoyer le paquet sur votre site Web.</p></li>\n<li><p>Publier le paquet dans un dépôt public, tel que le <a class=\"reference internal\" href=\"#the-python-package-index-pypi\">Python Package Index (PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> dispose d’un <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">bon tutoriel</a> (en anglais) qui explique comment faire cela.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-a-virtual-environment\">\n<h2>Installation de paquets Python avec un environnement virtuel<a class=\"heading-anchor\" href=\"#installing-python-packages-with-a-virtual-environment\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Précédemment, nous avons installé <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> comme bibliothèque utilisateur. Cela comporte quelques désavantages :</p>\n<ul class=\"simple\">\n<li><p>La modification de bibliothèques utilisateurs peut influencer d’autres logiciels Python sur votre système.</p></li>\n<li><p>Vous ne pourrez pas faire fonctionner plusieurs versions de ce paquet en parallèle (ou avec d’autres portant le même nom).</p></li>\n</ul>\n<p>Typiquement, ces situations ne se produisent que lorsque vous maintenez plusieurs projets Django. Dans ces cas, la meilleure solution est d’utiliser <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/venv.html\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-doc\">venv</span></a>. Cet outil permet de maintenir plusieurs environnements Python isolés les uns des autres, ayant chacun leur propre copie des bibliothèques et de l’espace de nom des paquets.</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"Importance du recyclage","anchor":"reusability-matters","children":[]},{"title":"Votre projet et votre application recyclable","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"Installation de quelques prérequis","anchor":"installing-some-prerequisites","children":[]},{"title":"Empaquetage de l’application","anchor":"packaging-your-app","children":[]},{"title":"Utilisation de son propre paquet","anchor":"using-your-own-package","children":[]},{"title":"Publication de l’application","anchor":"publishing-your-app","children":[]},{"title":"Installation de paquets Python avec un environnement virtuel","anchor":"installing-python-packages-with-a-virtual-environment","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Premiers pas","url":"/fr/5.0/intro/"}],"prev":{"docname":"intro/tutorial08","title":"Écriture de votre première application Django, 8ème partie","url":"/fr/5.0/intro/tutorial08/"},"next":{"docname":"intro/whatsnext","title":"Quelle lecture pour la suite","url":"/fr/5.0/intro/whatsnext/"},"formats":{"html":"/fr/5.0/intro/reusable-apps/","markdown":"/fr/5.0/intro/reusable-apps.md","json":"/fr/5.0/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/fr/5.0/intro/reusable-apps/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}