高度なチュートリアル:再利用可能なアプリの作成方法—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/intro/reusable-apps
移動先:案内検索

高度なチュートリアル:再利用可能なアプリの作成方法

この高度なチュートリアルは、 Tutorial 7 が中断したところから始まります。 Web-pollをスタンドアロンのPythonパッケージに変換し、新しいプロジェクトで再利用して他の人と共有できるようにします。

チュートリアル1〜7を最近完了していない場合は、サンプルプロジェクトが以下に説明するものと一致するように、これらを確認することをお勧めします。

再利用性が重要

Webアプリケーションを設計、構築、テスト、および保守するのは大変な作業です。 多くのPythonプロジェクトとDjangoプロジェクトは、共通の問題を共有しています。 この繰り返される作業の一部を保存できたら素晴らしいと思いませんか?

再利用性はPythonの生き方です。 Python Package Index(PyPI)には、独自のPythonプログラムで使用できる幅広いパッケージがあります。 プロジェクトに組み込むことができる既存の再利用可能なアプリについては、 Djangoパッケージを確認してください。 Django自体も通常のPythonパッケージです。 これは、既存のPythonパッケージまたはDjangoアプリを使用して、それらを独自のWebプロジェクトに構成できることを意味します。 あなたはあなたのプロジェクトをユニークにする部分を書く必要があるだけです。

私たちが取り組んでいるような投票アプリを必要とする新しいプロジェクトを開始したとしましょう。 このアプリを再利用可能にするにはどうすればよいですか? 幸いなことに、あなたはすでに順調に進んでいます。 Tutorial 1 では、includeを使用して、プロジェクトレベルのURLconfからポーリングを分離する方法を説明しました。 このチュートリアルでは、アプリを新しいプロジェクトで使いやすくし、他のユーザーがインストールして使用できるように公開できるようにするための手順をさらに進めます。

パッケージ? アプリ?

Python パッケージは、関連するPythonコードをグループ化して簡単に再利用する方法を提供します。 パッケージには、Pythonコードの1つ以上のファイル(「モジュール」とも呼ばれます)が含まれています。

パッケージはimport foo.barまたはfrom foo import barでインポートできます。 ディレクトリ(pollsなど)がパッケージを形成するには、このファイルが空であっても、特別なファイル__init__.pyが含まれている必要があります。

Django application は、Djangoプロジェクトでの使用を特に目的としたPythonパッケージです。 アプリケーションは、modelstestsurlsviewsサブモジュールなど、一般的なDjangoの規則を使用できます。

後で、 packageging という用語を使用して、Pythonパッケージを他の人が簡単にインストールできるようにするプロセスを説明します。 少し混乱するかもしれませんが、私たちは知っています。


プロジェクトと再利用可能なアプリ

前のチュートリアルの後、プロジェクトは次のようになります。

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
            0001_initial.py
        models.py
        static/
            polls/
                images/
                    background.gif
                style.css
        templates/
            polls/
                detail.html
                index.html
                results.html
        tests.py
        urls.py
        views.py
    templates/
        admin/
            base_site.html

Tutorial 7mysite/templatesを作成し、 Tutorial 3polls/templatesを作成しました。 プロジェクトとアプリケーションに別々のテンプレートディレクトリを選択した理由が明らかになりました。ポーリングアプリケーションの一部であるものはすべてpollsにあります。 これにより、アプリケーションは自己完結型になり、新しいプロジェクトに簡単にドロップできます。

pollsディレクトリを新しいDjangoプロジェクトにコピーして、すぐに再利用できるようになりました。 ただし、公開する準備はまだ整っていません。 そのためには、他の人が簡単にインストールできるようにアプリをパッケージ化する必要があります。


いくつかの前提条件をインストールする

Pythonパッケージの現在の状態は、さまざまなツールで少し混乱しています。 このチュートリアルでは、 setuptools を使用してパッケージをビルドします。 これは推奨されるパッケージツールです(distributeフォークとマージされています)。 また、 pip を使用してインストールおよびアンインストールします。 これら2つのパッケージを今すぐインストールする必要があります。 ヘルプが必要な場合は、 pipを使用してDjangoをインストールする方法を参照してください。 setuptoolsも同じようにインストールできます。


アプリのパッケージ化

Python packageging は、簡単にインストールして使用できる特定の形式でアプリを準備することを指します。 Django自体はこのようにパッケージ化されています。 投票のような小さなアプリの場合、このプロセスはそれほど難しくありません。

  1. まず、Djangoプロジェクトの外部に、pollsの親ディレクトリを作成します。 このディレクトリをdjango-pollsと呼びます。

    アプリの名前を選択する

    パッケージの名前を選択するときは、PyPIなどのリソースを確認して、既存のパッケージとの名前の競合を回避してください。 配布するパッケージを作成するときに、モジュール名の前にdjango-を付けると便利なことがよくあります。 これは、Djangoアプリを探している他の人があなたのアプリをDjango固有のものとして識別するのに役立ちます。

    アプリケーションラベル(つまり、アプリケーションパッケージへの点線のパスの最後の部分)は、:setting: `INSTALLED_APPS` で一意である必要がありますauthadminmessagesなど、Django 投稿パッケージと同じラベルを使用しないでください。

  2. pollsディレクトリをdjango-pollsディレクトリに移動します。

  3. 次の内容のファイルdjango-polls/README.rstを作成します。

    django-polls / README.rst

    =====
    Polls
    =====
    
    Polls is a Django app to conduct Web-based polls. For each question,
    visitors can choose between a fixed number of answers.
    
    Detailed documentation is in the "docs" directory.
    
    Quick start
    -----------
    
    1. Add "polls" to your INSTALLED_APPS setting like this::
    
        INSTALLED_APPS = [
            ...
            'polls',
        ]
    
    2. Include the polls URLconf in your project urls.py like this::
    
        path('polls/', include('polls.urls')),
    
    3. Run ``python manage.py migrate`` to create the polls models.
    
    4. Start the development server and visit http://127.0.0.1:8000/admin/
       to create a poll (you'll need the Admin app enabled).
    
    5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.
  4. django-polls/LICENSEファイルを作成します。 ライセンスの選択はこのチュートリアルの範囲を超えていますが、ライセンスなしで公開されているコードは役に立たないと言えば十分です。 Djangoおよび多くのDjango互換アプリは、BSDライセンスの下で配布されています。 ただし、独自のライセンスを自由に選択できます。 ライセンスの選択は、コードを使用できるユーザーに影響することに注意してください。

  5. 次に、アプリのビルドとインストールの方法を詳しく説明したsetup.cfgファイルとsetup.pyファイルを作成します。 これらのファイルの完全な説明はこのチュートリアルの範囲を超えていますが、 setuptoolsドキュメントには適切な説明があります。 次の内容でファイルdjango-polls/setup.cfgおよびdjango-polls/setup.pyを作成します。

    django-polls / setup.cfg

    [metadata]
    name = django-polls
    version = 0.1
    description = A Django app to conduct Web-based polls.
    long_description = file: README.rst
    url = https://www.example.com/
    author = Your Name
    author_email = [email protected]
    license = BSD-3-Clause  # Example license
    classifiers =
        Environment :: Web Environment
        Framework :: Django
        Framework :: Django :: X.Y  # Replace "X.Y" as appropriate
        Intended Audience :: Developers
        License :: OSI Approved :: BSD License
        Operating System :: OS Independent
        Programming Language :: Python
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: 3.6
        Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
        Topic :: Internet :: WWW/HTTP
        Topic :: Internet :: WWW/HTTP :: Dynamic Content
    
    [options]
    include_package_data = true
    packages = find:
    python_requires = >=3.6
    install_requires =
        Django >= X.Y  # Replace "X.Y" as appropriate

    django-polls / setup.py

    from setuptools import setup
    
    setup()
  6. デフォルトでは、Pythonモジュールとパッケージのみがパッケージに含まれています。 追加のファイルを含めるには、MANIFEST.inファイルを作成する必要があります。 前のステップで参照したsetuptoolsのドキュメントでは、このファイルについて詳しく説明しています。 テンプレート、README.rst、およびLICENSEファイルを含めるには、次の内容のファイルdjango-polls/MANIFEST.inを作成します。

    django-polls / MANIFEST.in

    include LICENSE
    include README.rst
    recursive-include polls/static *
    recursive-include polls/templates *
  7. オプションですが、アプリに詳細なドキュメントを含めることをお勧めします。 今後のドキュメントのために、空のディレクトリdjango-polls/docsを作成します。 django-polls/MANIFEST.inに行を追加します。

    recursive-include docs *

    docsディレクトリは、いくつかのファイルを追加しない限り、パッケージに含まれないことに注意してください。 多くのDjangoアプリは、 readthedocs.org などのサイトを通じてオンラインでドキュメントを提供しています。

  8. python setup.py sdistdjango-pollsの内部から実行)を使用してパッケージをビルドしてみてください。 これにより、distというディレクトリが作成され、新しいパッケージdjango-polls-0.1.tar.gzが作成されます。

パッケージ化の詳細については、Pythonのプロジェクトのパッケージ化と配布に関するチュートリアルを参照してください。


独自のパッケージを使用する

pollsディレクトリをプロジェクトから移動したため、機能しなくなりました。 新しいdjango-pollsパッケージをインストールして、これを修正します。

ユーザーライブラリとしてインストールする

次の手順では、django-pollsをユーザーライブラリとしてインストールします。 ユーザーごとのインストールには、管理者アクセス権のないシステムで使用できることや、パッケージがシステムサービスやマシンの他のユーザーに影響を与えないことなど、システム全体にパッケージをインストールするよりも多くの利点があります。

ユーザーごとのインストールは、そのユーザーとして実行されるシステムツールの動作に影響を与える可能性があるため、仮想環境を使用する方がより堅牢なソリューションであることに注意してください(以下を参照)。


  1. パッケージをインストールするには、pipを使用します(すでにインストール済みですよね?):

    python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz
  2. 運が良ければ、Djangoプロジェクトは再び正しく機能するはずです。 サーバーを再度実行して、これを確認します。

  3. パッケージをアンインストールするには、pipを使用します。

    python -m pip uninstall django-polls


アプリを公開する

django-pollsをパッケージ化してテストしたので、世界と共有する準備が整いました。 これが単なる例ではない場合は、次のことができます。


仮想環境でのPythonパッケージのインストール

以前、投票アプリをユーザーライブラリとしてインストールしました。 これにはいくつかの欠点があります。

  • ユーザーライブラリを変更すると、システム上の他のPythonソフトウェアに影響を与える可能性があります。
  • このパッケージの複数のバージョン(または同じ名前の他のバージョン)を実行することはできません。

通常、これらの状況は、複数のDjangoプロジェクトを保守している場合にのみ発生します。 その場合、最善の解決策は venv を使用することです。 このツールを使用すると、それぞれがライブラリとパッケージ名前空間の独自のコピーを持つ、複数の分離されたPython環境を維持できます。