{"title":"高度なチュートリアル: 再利用可能アプリの書き方","version":"5.1","locale":"ja","docname":"intro/reusable-apps","url":"/ja/5.1/intro/reusable-apps/","canonical":"https://djangodocs.dev/ja/5.1/intro/reusable-apps/","summary":"この高度なチュートリアルは、 チュートリアル その8 が終わったところから始まります。Web投票アプリケーションを、新しいプロジェクトで再利用でき、他の人に共有できる独立した Python のパッケージへと変えていきましょう。 最近、チュートリアル 1〜8…","html":"<h1>高度なチュートリアル: 再利用可能アプリの書き方<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>この高度なチュートリアルは、<a class=\"reference internal\" href=\"/ja/5.1/intro/tutorial08/\"><span class=\"doc\">チュートリアル その8</span></a> が終わったところから始まります。Web投票アプリケーションを、新しいプロジェクトで再利用でき、他の人に共有できる独立した Python のパッケージへと変えていきましょう。</p>\n<p>最近、チュートリアル 1〜8 を完了したのではない場合は、以下に記載されている内容と一致するように、例題プロジェクトを見直すことをお勧めします。</p>\n<section id=\"reusability-matters\">\n<h2>再利用性の問題<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Web アプリケーションの設計、開発、テスト、そしてメンテナンスには多大な労力が必要です。そして多くの Python プロジェクト、 Django プロジェクトは共通の問題を抱えています。この繰り返し作業を減らせたら良いと思いませんか？</p>\n<p>再利用可能性はPythonの生き様とも言えるものです。<a class=\"reference external\" href=\"https://pypi.org/\">Python Package Index (PyPI)</a> にはあなたの Pythonプログラムに使用できる非常に幅広いパッケージが揃っています。あなたのプロジェクトに組み込むことのできる再利用可能なアプリについては、<a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> を見てみてください。Django そのものも、普通のPython パッケージのひとつです。あなたは既存のPythonパッケージや Django アプリを選んで、自分の Web プロジェクトに組み込むことができます。つまり、あなたは自分のプロジェクトに特有の部分にだけ取り組めば良いのです。</p>\n<p>例えば、投票アプリケーション（ちょうど今まで作ってきたものと似たようなもの）を必要とするプロジェクトを新しく開始したとしましょう。どうやって投票アプリケーションを再利用可能にしますか？運のいいことに、その方法はすでに会得済みです。 <a class=\"reference internal\" href=\"/ja/5.1/intro/tutorial01/\"><span class=\"doc\">チュートリアル1</span></a> では、 <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code> を使ってプロジェクトレベルの URLconf から投票アプリを分離する方法を学びました。このチュートリアルでは、アプリケーションを新規のプロジェクトで使いやすいようにし、いつでも別の場所でインストール/利用できるようにします。</p>\n<aside class=\"admonition-package-app admonition\">\n<p class=\"admonition-title\">パッケージ？アプリ？</p>\n<p>Python の <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(in Python v3.14)\"><span class=\"xref std std-term\">package</span></a> を使うと、関連する Python コードをまとめて再利用しやすいようにできます。パッケージは、 Python コードのファイル ( 通称 &quot;モジュール&quot; ) を１つ以上含みます。</p>\n<p>パッケージは <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">foo.bar</span></code> または <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> でインポートできます。パッケージ内のディレクトリ (例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>) は <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> という特殊なファイルを、空のファイルでもいいので含む必要があります。</p>\n<p>Django <em>アプリケーション</em> は単なる Python パッケージで、 Django プロジェクトで使うことのみを意図したものです。アプリは一般的な Django の慣例に則っているでしょう。例えば <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> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">views</span></code> のサブモジュールがあること、などです。</p>\n<p>後に <em>パッケージング</em> という言葉を、他の人がインストールしやすいように Python パッケージを作るプロセスを表すのに用います。少し混乱するかもしれませんね。</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>プロジェクトと再利用可能アプリ<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>前のチュートリアルを終えると、プロジェクトはこのようになっているはずです:</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>djangotutorial/\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><code class=\"docutils literal notranslate\"><span class=\"pre\">djangotutorial/templates</span></code> は <a class=\"reference internal\" href=\"/ja/5.1/intro/tutorial07/\"><span class=\"doc\">チュートリアル7</span></a> で作成し、<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code> は <a class=\"reference internal\" href=\"/ja/5.1/intro/tutorial03/\"><span class=\"doc\">チュートリアル3</span></a> で作成しました。今は、なぜプロジェクトとアプリケーションに別々のテンプレートディレクトリを設けることにしたのかが、より明確になったかもしれません。pollsアプリケーションに関連するすべてのものは <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> フォルダ内にあります。これにより、アプリケーションは自己完結型となり、新しいプロジェクトに簡単に組み込むことができます。</p>\n<p>今、 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリは新規の Django プロジェクトにコピーでき、すぐに再利用できる状態です。しかし公開するための準備が完璧というわけではありません。そのために、アプリをパッケージにして別の場所でインストールしやすいようにする必要があります。</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>事前に必要な物をインストールする<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python のパッケージングの現状は、複数のツールがあることで少しややこしいです。このチュートリアルでは <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> をパッケージに使用します。これはおすすめのパッケージングツールです( forkされていた <code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code> はマージされました)。終わった後にアンインストールするために <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pip/\">pip</a> も使います。今はこの 2 つのパッケージをインストールしておいてください。分からなければ <a class=\"reference internal\" href=\"/ja/5.1/topics/install/#installing-official-release\"><span class=\"std std-ref\">Django をpip でインストールする</span></a>. を参照してください。 <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> も同じ方法でインストールできます。</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>アプリケーションをパッケージングする<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python において <em>パッケージング</em> とは、特定のフォーマットでアプリを作っておくことです。このフォーマットは簡単にインストールして使えます。 Django 自体もこのようにパッケージ化されています。投票アプリのような小さなものでは、このプロセスはそれほど難しいものではありません。</p>\n<ol class=\"arabic\">\n<li><p>まず、Django プロジェクトの外に、パッケージのための親ディレクトリを作成します。以降、このディレクトリを <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\">アプリケーションの名前を決める</p>\n<p>パッケージ名を決める際には、既存のパッケージとの名前の衝突を避けるために PyPI をチェックしてください。パッケージ名には Django 固有のパッケージであることを示すために <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> という接頭辞をつけ、モジュール名にはそれに対応する <code class=\"docutils literal notranslate\"><span class=\"pre\">django_</span></code> という接頭辞を付けることを推奨します。例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-ratelimit</span></code> パッケージは <code class=\"docutils literal notranslate\"><span class=\"pre\">django_ratelimit</span></code> モジュールを含んでいます。</p>\n<p>アプリケーションラベル (すなわち、アプリケーションパッケージへのパス（ドット区切り）の最後の部分) は <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> の中で <em>必ず</em> ユニークでなければなりません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> のようなDjango <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/\"><span class=\"doc\">contrib packages</span></a> と同じラベルを使うことは避けてください。</p>\n</aside>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリを <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> ディレクトリに移動し、名前を <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls</span></code> に変更します。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls/apps.py</span></code> を編集して <a class=\"reference internal\" href=\"/ja/5.1/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> が新しいモジュール名を指すようにし、 <a class=\"reference internal\" href=\"/ja/5.1/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> を追加してアプリの短い名前を付けます:</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>以下の内容の <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code> という名前のファイルを作成します:</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><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/LICENSE</span></code> ファイルを作成します。ライセンスの選択はこのチュートリアルの範疇を超えていますが、ライセンスなしで公にリリースされたコードは <em>役立たず</em> であると言えば十分です。 Django と多くの Django 互換アプリケーションはBSDライセンスの元に配布されます。でもどのライセンスを選択するかは自由です。ライセンスの選択は、誰がコードを使え得るかに影響すると注意してください。</p></li>\n<li><p>次に、アプリケーションのビルドおよびインストール方法を詳細に記述した <code class=\"docutils literal notranslate\"><span class=\"pre\">pyproject.toml</span></code> ファイルを作成します。このファイルの詳細な説明は本チュートリアルの範囲を超えますが、<a class=\"reference external\" href=\"https://packaging.python.org/ja/latest/guides/writing-pyproject-toml/\">Pythonパッケージユーザーガイド</a> に良い説明があります。以下の内容で <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/pyproject.toml</span></code> ファイルを作成してください。</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=\"s2\">&quot;setuptools&gt;=77.0.3&quot;</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=\"s2\">&quot;setuptools.build_meta&quot;</span>\n\n<span class=\"k\">[project]</span>\n<span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;django-polls&quot;</span>\n<span class=\"n\">version</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;0.1&quot;</span>\n<span class=\"n\">dependencies</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;django&gt;=X.Y&quot;</span><span class=\"p\">,</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"p\">]</span>\n<span class=\"n\">description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;A Django app to conduct web-based polls.&quot;</span>\n<span class=\"n\">readme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;README.rst&quot;</span>\n<span class=\"n\">license</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;BSD-3-Clause&quot;</span>\n<span class=\"n\">requires-python</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;&gt;= 3.10&quot;</span>\n<span class=\"n\">authors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">    </span><span class=\"p\">{</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"p\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;Your Name&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">email</span><span class=\"w\"> </span><span class=\"p\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;yourname@example.com&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">]</span>\n<span class=\"n\">classifiers</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Environment :: Web Environment&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Framework :: Django&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Framework :: Django :: X.Y&quot;</span><span class=\"p\">,</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Intended Audience :: Developers&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Operating System :: OS Independent&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3 :: Only&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.10&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.11&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.12&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.13&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Topic :: Internet :: WWW/HTTP&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Topic :: Internet :: WWW/HTTP :: Dynamic Content&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n\n<span class=\"k\">[project.urls]</span>\n<span class=\"n\">Homepage</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;https://www.example.com/&quot;</span>\n</code></pre></figure>\n</li>\n<li><p>多くの一般的なファイルやPythonモジュール、パッケージは、デフォルトでパッケージに含まれています。追加のファイルを含めるには、<code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> ファイルを作成する必要があります。テンプレートや静的ファイルを含めるために、以下の内容で <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> ファイルを作成してください。</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>recursive-include django_polls/static *\nrecursive-include django_polls/templates *\n</code></pre></figure>\n</li>\n<li><p>これは必須ではありませんが、アプリケーションには詳細なドキュメントを含めることが推奨されます。将来のドキュメント用に、空のディレクトリ <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> を作成してください。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> に対象のファイルを追加しないと <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code> ディレクトリがパッケージに含まれないことに注意してください。多くの Django アプリではドキュメントを <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a> のようなサイトを通して提供しています。</p>\n<p>Many Python projects, including Django and Python itself, use <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/quickstart.html\">Sphinx</a> to build\ntheir documentation. If you choose to use Sphinx you can link back to the\nDjango documentation by configuring <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/quickstart.html#intersphinx\">Intersphinx</a>\nand including a value for Django in your project's <code class=\"docutils literal notranslate\"><span class=\"pre\">intersphinx_mapping</span></code>\nvalue:</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\">intersphinx_mapping</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;https://docs.djangoproject.com/en/stable/&quot;</span><span class=\"p\">,</span>\n        <span class=\"kc\">None</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>With that in place, you can then cross-link to specific entries, in the\nsame way as in the Django docs, such as\n&quot;<code class=\"docutils literal notranslate\"><span class=\"pre\">:attr:`django.test.TransactionTestCase.databases`</span></code>&quot;.</p>\n</li>\n<li><p>Check that the <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/build/\">build</a> package is installed (<code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-m</span> <span class=\"pre\">pip</span> <span class=\"pre\">install</span>\n<span class=\"pre\">build</span></code>) and try building your package by running <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-m</span> <span class=\"pre\">build</span></code> inside\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>. This creates a directory called <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> and builds your\nnew package into source and binary formats, <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls-0.1.tar.gz</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls-0.1-py3-none-any.whl</span></code>.</p></li>\n</ol>\n<p>パッケージングに関するより豊富な情報は <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">プロジェクトのパッケージ化と配布に関するチュートリアル</a> にあります。</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>自分のパッケージを使ってみる<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリはプロジェクト外に移動したので、これはもう動きません。代わりにできたての <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\">ユーザーライブラリとしてインストールする</p>\n<p>以下のステップは <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> をユーザーライブラリとしてインストールするものです。ユーザー単位でのインストールはシステム全体でのインストールよりも多くの利点があります。管理者アクセス権を持っていないシステム上で使用可能というだけでなく、パッケージがシステムサービスやマシン上の他ユーザーに影響を与えるのを防げます。</p>\n<p>ユーザーごとのインストールは、そのユーザーとして実行されるシステムツールの動作に影響を与える可能性があるため、仮想環境を使用する方がより堅牢なソリューションであることに注意してください（以下を参照）。</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>パッケージをインストールするためには、pip を利用してください (すでに  <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">インストール</span></a> していますよね?):</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>新しいモジュール名を指すように <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</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\">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>新しいモジュール名を指すように <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</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\">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>開発サーバーを実行して、プロジェクトが引き続き動作することを確認します。</p></li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>アプリを公開する<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> のパッケージを作り、テストしました。世界に共有するときです！これが単なる例でなければこうします:</p>\n<ul class=\"simple\">\n<li><p>パッケージを友人にメールで送る</p></li>\n<li><p>自身の Web サイトにアップロードする</p></li>\n<li><p>公開されているリポジトリに投稿する。例えば <a class=\"reference internal\" href=\"#the-python-package-index-pypi\">the Python Package Index (PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> には <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">よくできたチュートリアル</a> があります。</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-a-virtual-environment\">\n<h2>仮想環境でのPythonパッケージのインストール<a class=\"heading-anchor\" href=\"#installing-python-packages-with-a-virtual-environment\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>先ほど、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> をユーザライブラリとしてインストールしました。これにはいくつかの欠点があります:</p>\n<ul class=\"simple\">\n<li><p>ユーザーライブラリの変更はシステム上の他の Python ソフトウェアに影響を与えるおそれがあります</p></li>\n<li><p>このパッケージの複数バージョン (もしくは同じ名前の別のもの) を実行できません</p></li>\n</ul>\n<p>通常、このような状況は複数の Django プロジェクトを管理している場合にのみ発生します。このような場合、最良の解決策は <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/venv.html\" title=\"(in Python v3.14)\"><span class=\"xref std std-doc\">venv</span></a> を使うことです。このツールを使うと、複数の分離されたPython環境を管理することができ、それぞれが独自のライブラリとパッケージの名前空間のコピーを持っています。</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"再利用性の問題","anchor":"reusability-matters","children":[]},{"title":"プロジェクトと再利用可能アプリ","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"事前に必要な物をインストールする","anchor":"installing-some-prerequisites","children":[]},{"title":"アプリケーションをパッケージングする","anchor":"packaging-your-app","children":[]},{"title":"自分のパッケージを使ってみる","anchor":"using-your-own-package","children":[]},{"title":"アプリを公開する","anchor":"publishing-your-app","children":[]},{"title":"仮想環境でのPythonパッケージのインストール","anchor":"installing-python-packages-with-a-virtual-environment","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"さぁ始めましょう","url":"/ja/5.1/intro/"}],"prev":{"docname":"intro/tutorial08","title":"はじめての Django アプリ作成、その 8","url":"/ja/5.1/intro/tutorial08/"},"next":{"docname":"intro/whatsnext","title":"次のステップへ","url":"/ja/5.1/intro/whatsnext/"},"formats":{"html":"/ja/5.1/intro/reusable-apps/","markdown":"/ja/5.1/intro/reusable-apps.md","json":"/ja/5.1/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/ja/5.1/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"]}