8.応用編: 再利用可能なアプリケーションの書き方#
再利用性の問題#
Web アプリケーションの設計、開発、テスト、そしてメンテナンスには多大な労力が必要です。 そして多くの Python プロジェクト、 Django プロジェクトは共通の問題を抱えています。この繰り返し作業を減らせたら良いと思うはずです。 そんなときは、Django Packagesから既存のPythonパッケージや Django アプリを選んで、自分の Web プロジェクトに組み込むことが可能。
プロジェクトと再利用可能アプリ#
前のチュートリアルを終えると、プロジェクトはこのようになっているはずです:
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
すでに mysite/templates を チュートリアル 7 で、 polls/templates を チュートリアル 3 で作成しました。 今となっては、なぜテンプレートディレクトリをプロジェクトとアプリケーションに分けたかが明確にわかるかもしれませんね。 投票アプリケーションに関する全ては polls にあります。アプリケーションが自己完結していて、新規のプロジェクトにも導入しやすくなっています。
今、 polls ディレクトリは新規の Django プロジェクトにコピーでき、すぐに再利用できる状態です。 しかし公開するための準備が完璧というわけではありません。 そのために、アプリをパッケージにして別の場所でインストールしやすいようにする必要があります。
事前に必要な物をインストールする#
Python のパッケージングの現状は、複数のツールがあることで少しややこしいです。 このチュートリアルでは setuptools をパッケージに使用します。 これはおすすめのパッケージングツールです( forkされていた distribute はマージされました)。 終わった後にアンインストールするために pip も使います。今はこの 2 つのパッケージをインストールしておいてください。分からなければ Django をpip でインストールする.を参照してください。 setuptools も同じ方法でインストールできます。
アプリケーションをパッケージングする#
Python において パッケージング とは、特定のフォーマットでアプリを作っておくことです。このフォーマットは簡単にインストールして使えます。 Django 自体もこのようにパッケージ化されています。投票アプリのような小さなものでは、このプロセスはそれほど難しいものではありません。
-
はじめに、 polls の親ディレクトリを、 Django プロジェクトの外に作りましょう。 django-polls というディレクトリにします !!! info "アプリケーションの名前を決める" パッケージの名前を決めるときは、 PyPI のようなリソースをチェックして、すでにあるパッケージとの名前の衝突を避ける必要があります。 Django アプリケーションのパッケージを作って配布する際には、モジュール名の先頭に django- を付けるのがよいでしょう。こうすると、 Django アプリを探している人にとって、あなたのアプリが Django 特化のものであると判別しやすくなります。
アプリケーションラベル (すなわち、アプリケーションパッケージへのパス(ドット区切り)の最後の部分) は INSTALLED_APPS の中で 必ず ユニークでなければなりません。 auth 、 admin 、 messages のようなDjango contrib packagesと同じラベルを使うことは避けてください。
-
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ライセンスの元に配布されます。でもどのライセンスを選択するかは自由です。ライセンスの選択は、誰がコードを使え得るかに影響すると注意してください。
-
次に、アプリをビルドしてインストールする方法を詳述する pyproject.toml、setup.cfg、および setup.py ファイルを作成します。 これらのファイルの完全な説明は、このチュートリアルの範囲を超えていますが、setuptools のドキュメントには適切な説明があります。 次の内容で django-polls/pyproject.toml、django-polls/setup.cfg、および django-polls/setup.py ファイルを作成します。
[build-system]
requires = ['setuptools>=40.8.0', 'wheel']
build-backend = 'setuptools.build_meta:__legacy__'
``` title"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 = yourname@example.com 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.8 Programming Language :: Python :: 3.9 Topic :: Internet :: WWW/HTTP Topic :: Internet :: WWW/HTTP :: Dynamic Content
[options] include_package_data = true packages = find: python_requires = >=3.8 install_requires = Django >= X.Y # Replace "X.Y" as appropriate
- デフォルトでは、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 *
- アプリケーションの詳細なドキュメントを含めるのは、任意ですが推奨されます。 空のディレクトリ django-polls/docs を将来のドキュメンテーションのために作っておきましょう。 django-polls/MANAFEST.in に行を追加しておいてください: MANIFEST.in に対象のファイルを追加しないと docs ディレクトリがパッケージに含まれないことに注意してください。多くの Django アプリではドキュメントを readthedocs.org のようなサイトを通して提供しています。
- python setup.py sdist でパッケージをビルドしてみましょう (django-polls 内で実行してください) 。これによって dist というディレクトリと、新しいパッケージである django-polls-0.1.tar.gz が作られます。
Info
パッケージングに関するより豊富な情報は プロジェクトのパッケージ化と配布に関するチュートリアル にあります。
自分のパッケージを使ってみる#
polls ディレクトリはプロジェクト外に移動したので、これはもう動きません。代わりにできたての django-polls パッケージを使ってみましょう。
ユーザーライブラリとしてインストールする
以下のステップは django-polls をユーザーライブラリとしてインストールするものです。ユーザー単位でのインストールはシステム全体でのインストールよりも多くの利点があります。管理者アクセス権を持っていないシステム上で使用可能というだけでなく、パッケージがシステムサービスやマシン上の他ユーザーに影響を与えるのを防げます。 ユーザーごとのインストールは、そのユーザーとして実行されるシステムツールの動作に影響を与える可能性があるため、仮想環境を使用する方がより堅牢なソリューションであることに注意してください(以下を参照)。
- パッケージをインストールするためには、pip を利用してください (すでに インストール していますよね?):
- 運が良ければ Django プロジェクトは再度、正常に動作します。確認するために再びサーバーを起動します。
- パッケージをアンインストールするには pip を使います: