{"title":"高度なチュートリアル: 再利用可能アプリの書き方","version":"2.0","locale":"ja","docname":"intro/reusable-apps","url":"/ja/2.0/intro/reusable-apps/","canonical":"https://djangodocs.dev/ja/2.0/intro/reusable-apps/","summary":"この高度なチュートリアルは、 Tutorial 7 が終わったところから始まります。Web-poll を、新しいプロジェクトで再利用でき、他の人に共有できる独立した Python…","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/2.0/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a> が終わったところから始まります。Web-poll を、新しいプロジェクトで再利用でき、他の人に共有できる独立した Python のパッケージへと変えていきましょう。</p>\n<p>直近のチュートリアル 1 - 7 が終わっていないなら、一目通すことをおすすめします。例で作ったプロジェクトが以下の説明でも使われるからです。</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>Reusability is the way of life in Python. <a class=\"reference external\" href=\"https://pypi.org/\">The Python Package Index (PyPI)</a> has a vast range of packages you can use in your own\nPython programs. Check out <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> for\nexisting reusable apps you could incorporate in your project. Django itself is\nalso just a Python package. This means that you can take existing Python\npackages or Django apps and compose them into your own web project. You only\nneed to write the parts that make your project unique.</p>\n<p>例えば、投票アプリケーション（ちょうど今まで作ってきたものと似たようなもの）を必要とするプロジェクトを新しく開始したとしましょう。どうやって投票アプリケーションを再利用可能にしますか？運のいいことに、その方法はすでに会得済みです。 <a class=\"reference internal\" href=\"/ja/2.0/intro/tutorial03/\"><span class=\"doc\">チュートリアル3</span></a> では、 <code class=\"docutils literal notranslate\">include</code> を使ってプロジェクトレベルの URLconf から投票アプリを分離する方法を学びました。このチュートリアルでは、アプリケーションを新規のプロジェクトで使いやすいようにし、いつでも別の場所でインストール/利用できるようにします。</p>\n<aside class=\"admonition-package-app admonition\" role=\"note\">\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\">import foo.bar</code> または <code class=\"docutils literal notranslate\">from foo import bar</code> でインポートできます。パッケージ内のディレクトリ (例えば <code class=\"docutils literal notranslate\">polls</code>) は <code class=\"docutils literal notranslate\">__init__.py</code> という特殊なファイルを、空のファイルでもいいので含む必要があります。</p>\n<p>Django <em>アプリケーション</em> は単なる Python パッケージで、 Django プロジェクトで使うことのみを意図したものです。アプリは一般的な Django の慣例に則っているでしょう。例えば <code class=\"docutils literal notranslate\">models</code> 、 <code class=\"docutils literal notranslate\">tests</code> 、 <code class=\"docutils literal notranslate\">urls</code> 、 <code class=\"docutils literal notranslate\">views</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=\"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>mysite<span class=\"o\">/</span>\n    manage<span class=\"o\">.</span>py\n    mysite<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n        settings<span class=\"o\">.</span>py\n        urls<span class=\"o\">.</span>py\n        wsgi<span class=\"o\">.</span>py\n    polls<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n        admin<span class=\"o\">.</span>py\n        migrations<span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n            <span class=\"mi\">0001</span>_initial<span class=\"o\">.</span>py\n        models<span class=\"o\">.</span>py\n        static<span class=\"o\">/</span>\n            polls<span class=\"o\">/</span>\n                images<span class=\"o\">/</span>\n                    background<span class=\"o\">.</span>gif\n                style<span class=\"o\">.</span>css\n        templates<span class=\"o\">/</span>\n            polls<span class=\"o\">/</span>\n                detail<span class=\"o\">.</span>html\n                index<span class=\"o\">.</span>html\n                results<span class=\"o\">.</span>html\n        tests<span class=\"o\">.</span>py\n        urls<span class=\"o\">.</span>py\n        views<span class=\"o\">.</span>py\n    templates<span class=\"o\">/</span>\n        admin<span class=\"o\">/</span>\n            base_site<span class=\"o\">.</span>html\n</code></pre></div>\n<p>すでに <code class=\"docutils literal notranslate\">mysite/templates</code> を <a class=\"reference internal\" href=\"/ja/2.0/intro/tutorial07/\"><span class=\"doc\">チュートリアル 7</span></a> で、 <code class=\"docutils literal notranslate\">polls/templates</code> を <a class=\"reference internal\" href=\"/ja/2.0/intro/tutorial03/\"><span class=\"doc\">チュートリアル 3</span></a> で作成しました。今となっては、なぜテンプレートディレクトリをプロジェクトとアプリケーションに分けたかが明確にわかるかもしれませんね。投票アプリケーションに関する全ては <code class=\"docutils literal notranslate\">polls</code> にあります。アプリケーションが自己完結していて、新規のプロジェクトにも導入しやすくなっています。</p>\n<p>今、 <code class=\"docutils literal notranslate\">polls</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=\"reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> をパッケージに使用します。これはおすすめのパッケージングツールです( forkされていた <code class=\"docutils literal notranslate\">distribute</code> はマージされました)。終わった後にアンインストールするために <a class=\"reference external\" href=\"https://pypi.org/project/pip/\">pip</a> も使います。今はこの 2 つのパッケージをインストールしておいてください。分からなければ <a class=\"reference internal\" href=\"/ja/2.0/topics/install/#installing-official-release\"><span class=\"std std-ref\">Django をpip でインストールする</span></a>. を参照してください。 <code class=\"docutils literal notranslate\">setuptools</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>はじめに、 <code class=\"docutils literal notranslate\">polls</code> の親ディレクトリを、 Django プロジェクトの外に作りましょう。 <code class=\"docutils literal notranslate\">django-polls</code> というディレクトリにします。</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\" role=\"note\">\n<p class=\"admonition-title\">アプリケーションの名前を決める</p>\n<p>パッケージの名前を決めるときは、 PyPI のようなリソースをチェックして、すでにあるパッケージとの名前の衝突を避ける必要があります。 Django アプリケーションのパッケージを作って配布する際には、モジュール名の先頭に <code class=\"docutils literal notranslate\">django-</code> を付けるのがよいでしょう。こうすると、 Django アプリを探している人にとって、あなたのアプリが Django 特化のものであると判別しやすくなります。</p>\n<p>アプリケーションラベル (すなわち、アプリケーションパッケージへのパス（ドット区切り）の最後の部分) は <a class=\"reference internal\" href=\"/ja/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> の中で <em>必ず</em> ユニークでなければなりません。 <code class=\"docutils literal notranslate\">auth</code> 、 <code class=\"docutils literal notranslate\">admin</code> 、 <code class=\"docutils literal notranslate\">messages</code> のようなDjango <a class=\"reference internal\" href=\"/ja/2.0/ref/contrib/\"><span class=\"doc\">contrib packages</span></a> と同じラベルを使うことは避けてください。</p>\n</aside>\n</li>\n<li><p><code class=\"docutils literal notranslate\">polls</code> ディレクトリを <code class=\"docutils literal notranslate\">django-polls</code> ディレクトリに移動する</p></li>\n<li><p>以下の内容の <code class=\"docutils literal notranslate\">django-polls/README.rst</code> という名前のファイルを作成します:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/README.rst</code></figcaption><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=\"django-polls/README.rst\"><code>=====\nPolls\n=====\n\nPolls is a simple 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\nQuick start\n-----------\n\n1. Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n        ...\n        &#39;polls&#39;,\n    ]\n\n2. Include the polls URLconf in your project urls.py like this::\n\n    path(&#39;polls/&#39;, include(&#39;polls.urls&#39;)),\n\n3. Run `python manage.py migrate` to create the polls models.\n\n4. Start the development server and visit http://127.0.0.1:8000/admin/\n   to create a poll (you&#39;ll need the Admin app enabled).\n\n5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p><code class=\"docutils literal notranslate\">django-polls/LICENSE</code> ファイルを作成します。ライセンスの選択はこのチュートリアルの範疇を超えていますが、ライセンスなしで公にリリースされたコードは <em>役立たず</em> であると言えば十分です。 Django と多くの Django 互換アプリケーションはBSDライセンスの元に配布されます。でもどのライセンスを選択するかは自由です。ライセンスの選択は、誰がコードを使え得るかに影響すると注意してください。</p></li>\n<li><p>次に <code class=\"docutils literal notranslate\">setup.py</code> ファイルを作りましょう。これはアプリケーションがどのようにビルド、インストールされるかを提供するものです。このファイルの網羅的な説明はこのチュートリアルの範疇を超えていますが、 <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools docs</a> には役立つ説明があります。以下のように <code class=\"docutils literal notranslate\">django-polls/setup.py</code> ファイルを作ってみましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/setup.py</code></figcaption><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=\"django-polls/setup.py\"><code><span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">from</span> <span class=\"nn\">setuptools</span> <span class=\"kn\">import</span> find_packages<span class=\"p\">,</span> setup\n\n<span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>join<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>dirname<span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"s1\">&#39;README.rst&#39;</span><span class=\"p\">))</span> <span class=\"k\">as</span> readme<span class=\"p\">:</span>\n    README <span class=\"o\">=</span> readme<span class=\"o\">.</span>read<span class=\"p\">()</span>\n\n<span class=\"c1\"># allow setup.py to be run from any path</span>\nos<span class=\"o\">.</span>chdir<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>normpath<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>join<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>abspath<span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> os<span class=\"o\">.</span>pardir<span class=\"p\">)))</span>\n\nsetup<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s1\">&#39;django-polls&#39;</span><span class=\"p\">,</span>\n    version<span class=\"o\">=</span><span class=\"s1\">&#39;0.1&#39;</span><span class=\"p\">,</span>\n    packages<span class=\"o\">=</span>find_packages<span class=\"p\">(),</span>\n    include_package_data<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    license<span class=\"o\">=</span><span class=\"s1\">&#39;BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n    description<span class=\"o\">=</span><span class=\"s1\">&#39;A simple Django app to conduct Web-based polls.&#39;</span><span class=\"p\">,</span>\n    long_description<span class=\"o\">=</span>README<span class=\"p\">,</span>\n    url<span class=\"o\">=</span><span class=\"s1\">&#39;https://www.example.com/&#39;</span><span class=\"p\">,</span>\n    author<span class=\"o\">=</span><span class=\"s1\">&#39;Your Name&#39;</span><span class=\"p\">,</span>\n    author_email<span class=\"o\">=</span><span class=\"s1\">&#39;yourname@example.com&#39;</span><span class=\"p\">,</span>\n    classifiers<span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"s1\">&#39;Environment :: Web Environment&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django :: X.Y&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># replace &quot;X.Y&quot; as appropriate</span>\n        <span class=\"s1\">&#39;Intended Audience :: Developers&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;License :: OSI Approved :: BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n        <span class=\"s1\">&#39;Operating System :: OS Independent&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.5&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.6&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP :: Dynamic Content&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></figure>\n</li>\n<li><p>デフォルトでは、パッケージには Python のモジュールとパッケージだけがまとめられます。追加のファイルを含めるには、<code class=\"docutils literal notranslate\">MANIFEST.in</code> というファイルを作成する必要があります。前のステップで挙げた setuptools のドキュメントには、このファイルについて詳しい説明があります。テンプレート、<code class=\"docutils literal notranslate\">README.rst</code>、および <code class=\"docutils literal notranslate\">LICENSE</code> をパッケージに含めるには、<code class=\"docutils literal notranslate\">django-polls/MANIFEST.in</code> というファイルを作成し、その中に次のように書きます。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/MANIFEST.in</code></figcaption><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=\"django-polls/MANIFEST.in\"><code>include LICENSE\ninclude README<span class=\"o\">.</span>rst\nrecursive<span class=\"o\">-</span>include polls<span class=\"o\">/</span>static <span class=\"o\">*</span>\nrecursive<span class=\"o\">-</span>include polls<span class=\"o\">/</span>templates <span class=\"o\">*</span>\n</code></pre></figure>\n</li>\n<li><p>アプリケーションの詳細なドキュメントを含めるのは、任意ですが推奨されます。空のディレクトリ <code class=\"docutils literal notranslate\">django-polls/docs</code> を将来のドキュメンテーションのために作っておきましょう。 <code class=\"docutils literal notranslate\">django-polls/MANAFEST.in</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>recursive<span class=\"o\">-</span>include docs <span class=\"o\">*</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">MANIFEST.in</code> に対象のファイルを追加しないと <code class=\"docutils literal notranslate\">docs</code> ディレクトリがパッケージに含まれないことに注意してください。多くの Django アプリではドキュメントを <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a> のようなサイトを通して提供しています。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">python setup.py sdist</code> でパッケージをビルドしてみましょう (<code class=\"docutils literal notranslate\">django-polls</code> 内で実行してください) 。これによって <code class=\"docutils literal notranslate\">dist</code> というディレクトリと、新しいパッケージである <code class=\"docutils literal notranslate\">django-polls-0.1.tar.gz</code> が作られます。</p></li>\n</ol>\n<p>パッケージングに関するより豊富な情報は <a class=\"reference external\" href=\"https://packaging.python.org/en/latest/distributing.html\">Tutorial on Packaging and Distributing 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\">polls</code> ディレクトリはプロジェクト外に移動したので、これはもう動きません。代わりにできたての <code class=\"docutils literal notranslate\">django-polls</code> パッケージを使ってみましょう。</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\" role=\"note\">\n<p class=\"admonition-title\">ユーザーライブラリとしてインストールする</p>\n<p>以下のステップは <code class=\"docutils literal notranslate\">django-polls</code> をユーザーライブラリとしてインストールするものです。ユーザー単位でのインストールはシステム全体でのインストールよりも多くの利点があります。管理者アクセス権を持っていないシステム上で使用可能というだけでなく、パッケージがシステムサービスやマシン上の他ユーザーに影響を与えるのを防げます。</p>\n<p>ユーザー単位でのインストールは依然、そのユーザーのシステムツールの振る舞いに影響をあたえます。なので <code class=\"docutils literal notranslate\">virtualenv</code> はより確実な解決になります (下記を参照してください) 。</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>パッケージをインストールするためには、pip を利用してください (すでに  <span class=\"xref std std-ref\">インストール</span> していますよね?):</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>pip install <span class=\"o\">--</span>user django<span class=\"o\">-</span>polls<span class=\"o\">/</span>dist<span class=\"o\">/</span>django<span class=\"o\">-</span>polls<span class=\"o\">-</span><span class=\"mf\">0.1</span><span class=\"o\">.</span>tar<span class=\"o\">.</span>gz\n</code></pre></div>\n</li>\n<li><p>運が良ければ Django プロジェクトは再度、正常に動作します。確認するために再びサーバーを起動します。</p></li>\n<li><p>パッケージをアンインストールするには pip を使います:</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>pip uninstall django<span class=\"o\">-</span>polls\n</code></pre></div>\n</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\">django-polls</code> のパッケージを作り、テストしました。世界に共有するときです！これが単なる例でなければこうします:</p>\n<ul class=\"simple\">\n<li><p>パッケージを友人にメールで送る</p></li>\n<li><p>自身の Web サイトにアップロードする</p></li>\n<li><p>公開されているリポジトリに投稿する。例えば <a class=\"reference external\" href=\"https://pypi.org/\">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/en/latest/distributing.html#uploading-your-project-to-pypi\">よくできたチュートリアル</a> があります。</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-virtualenv\">\n<h2>virtualenv に Python パッケージをインストールする<a class=\"heading-anchor\" href=\"#installing-python-packages-with-virtualenv\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>これまでは投票アプリをユーザーライブラリにインストールしてきました。これにはいくつか欠点があります:</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://virtualenv.pypa.io/\">virtualenv</a> を利用することです。このツールを使えば、複数の独立した Python 環境を持つことができます。各 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":"virtualenv に Python パッケージをインストールする","anchor":"installing-python-packages-with-virtualenv","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"さぁ始めましょう","url":"/ja/2.0/intro/"}],"prev":{"docname":"intro/tutorial07","title":"はじめての Django アプリ作成、その 7","url":"/ja/2.0/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"次のステップへ","url":"/ja/2.0/intro/whatsnext/"},"formats":{"html":"/ja/2.0/intro/reusable-apps/","markdown":"/ja/2.0/intro/reusable-apps.md","json":"/ja/2.0/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/ja/2.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","pt-br","ko","es","el","pl"]}