高度なチュートリアル:再利用可能なアプリの作成方法
この高度なチュートリアルは、 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パッケージです。 アプリケーションは、models
、tests
、urls
、views
サブモジュールなど、一般的な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 7 でmysite/templates
を作成し、 Tutorial 3 でpolls/templates
を作成しました。 プロジェクトとアプリケーションに別々のテンプレートディレクトリを選択した理由が明らかになりました。ポーリングアプリケーションの一部であるものはすべてpolls
にあります。 これにより、アプリケーションは自己完結型になり、新しいプロジェクトに簡単にドロップできます。
polls
ディレクトリを新しいDjangoプロジェクトにコピーして、すぐに再利用できるようになりました。 ただし、公開する準備はまだ整っていません。 そのためには、他の人が簡単にインストールできるようにアプリをパッケージ化する必要があります。
いくつかの前提条件をインストールする
Pythonパッケージの現在の状態は、さまざまなツールで少し混乱しています。 このチュートリアルでは、 setuptools を使用してパッケージをビルドします。 これは推奨されるパッケージツールです(distribute
フォークとマージされています)。 また、 pip を使用してインストールおよびアンインストールします。 これら2つのパッケージを今すぐインストールする必要があります。 ヘルプが必要な場合は、 pipを使用してDjangoをインストールする方法を参照してください。 setuptools
も同じようにインストールできます。
アプリのパッケージ化
Python packageging は、簡単にインストールして使用できる特定の形式でアプリを準備することを指します。 Django自体はこのようにパッケージ化されています。 投票のような小さなアプリの場合、このプロセスはそれほど難しくありません。
まず、Djangoプロジェクトの外部に、
polls
の親ディレクトリを作成します。 このディレクトリをdjango-polls
と呼びます。アプリの名前を選択する
パッケージの名前を選択するときは、PyPIなどのリソースを確認して、既存のパッケージとの名前の競合を回避してください。 配布するパッケージを作成するときに、モジュール名の前に
django-
を付けると便利なことがよくあります。 これは、Djangoアプリを探している他の人があなたのアプリをDjango固有のものとして識別するのに役立ちます。アプリケーションラベル(つまり、アプリケーションパッケージへの点線のパスの最後の部分)は、:setting: `INSTALLED_APPS` で一意である必要があります。
auth
、admin
、messages
など、Django 投稿パッケージと同じラベルを使用しないでください。polls
ディレクトリをdjango-polls
ディレクトリに移動します。次の内容のファイル
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.
django-polls/LICENSE
ファイルを作成します。 ライセンスの選択はこのチュートリアルの範囲を超えていますが、ライセンスなしで公開されているコードは役に立たないと言えば十分です。 Djangoおよび多くのDjango互換アプリは、BSDライセンスの下で配布されています。 ただし、独自のライセンスを自由に選択できます。 ライセンスの選択は、コードを使用できるユーザーに影響することに注意してください。次に、アプリのビルドとインストールの方法を詳しく説明した
setup.cfg
ファイルとsetup.py
ファイルを作成します。 これらのファイルの完全な説明はこのチュートリアルの範囲を超えていますが、 setuptoolsドキュメントには適切な説明があります。 次の内容でファイルdjango-polls/setup.cfg
およびdjango-polls/setup.py
を作成します。[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
from setuptools import setup setup()
デフォルトでは、Pythonモジュールとパッケージのみがパッケージに含まれています。 追加のファイルを含めるには、
MANIFEST.in
ファイルを作成する必要があります。 前のステップで参照したsetuptoolsのドキュメントでは、このファイルについて詳しく説明しています。 テンプレート、README.rst
、およびLICENSE
ファイルを含めるには、次の内容のファイルdjango-polls/MANIFEST.in
を作成します。include LICENSE include README.rst recursive-include polls/static * recursive-include polls/templates *
オプションですが、アプリに詳細なドキュメントを含めることをお勧めします。 今後のドキュメントのために、空のディレクトリ
django-polls/docs
を作成します。django-polls/MANIFEST.in
に行を追加します。recursive-include docs *
docs
ディレクトリは、いくつかのファイルを追加しない限り、パッケージに含まれないことに注意してください。 多くのDjangoアプリは、 readthedocs.org などのサイトを通じてオンラインでドキュメントを提供しています。python setup.py sdist
(django-polls
の内部から実行)を使用してパッケージをビルドしてみてください。 これにより、dist
というディレクトリが作成され、新しいパッケージdjango-polls-0.1.tar.gz
が作成されます。
パッケージ化の詳細については、Pythonのプロジェクトのパッケージ化と配布に関するチュートリアルを参照してください。
独自のパッケージを使用する
polls
ディレクトリをプロジェクトから移動したため、機能しなくなりました。 新しいdjango-polls
パッケージをインストールして、これを修正します。
ユーザーライブラリとしてインストールする
次の手順では、django-polls
をユーザーライブラリとしてインストールします。 ユーザーごとのインストールには、管理者アクセス権のないシステムで使用できることや、パッケージがシステムサービスやマシンの他のユーザーに影響を与えないことなど、システム全体にパッケージをインストールするよりも多くの利点があります。
ユーザーごとのインストールは、そのユーザーとして実行されるシステムツールの動作に影響を与える可能性があるため、仮想環境を使用する方がより堅牢なソリューションであることに注意してください(以下を参照)。
パッケージをインストールするには、pipを使用します(すでにインストール済みですよね?):
python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz
運が良ければ、Djangoプロジェクトは再び正しく機能するはずです。 サーバーを再度実行して、これを確認します。
パッケージをアンインストールするには、pipを使用します。
python -m pip uninstall django-polls
アプリを公開する
django-polls
をパッケージ化してテストしたので、世界と共有する準備が整いました。 これが単なる例ではない場合は、次のことができます。
- パッケージを友人にメールで送信します。
- あなたのウェブサイトにパッケージをアップロードしてください。
- Python Package Index(PyPI)などの公開リポジトリにパッケージを投稿します。 packages.python.org には、これを行うための優れたチュートリアルがあります。
仮想環境でのPythonパッケージのインストール
以前、投票アプリをユーザーライブラリとしてインストールしました。 これにはいくつかの欠点があります。
- ユーザーライブラリを変更すると、システム上の他のPythonソフトウェアに影響を与える可能性があります。
- このパッケージの複数のバージョン(または同じ名前の他のバージョン)を実行することはできません。
通常、これらの状況は、複数のDjangoプロジェクトを保守している場合にのみ発生します。 その場合、最善の解決策は venv を使用することです。 このツールを使用すると、それぞれがライブラリとパッケージ名前空間の独自のコピーを持つ、複数の分離されたPython環境を維持できます。