---
title: "Tutorial lanjut: Bagaimana menulis aplikasi digunakan kembali"
version: 5.0
locale: id
source: https://docs.djangoproject.com/id/5.0/intro/reusable-apps/
canonical: https://djangodocs.dev/id/5.0/intro/reusable-apps/
---
# Tutorial lanjut: Bagaimana menulis aplikasi digunakan kembali

This advanced tutorial begins where [Tutorial 8](/id/5.0/intro/tutorial08/)
left off. We'll be turning our web-poll into a standalone Python package
you can reuse in new projects and share with other people.

Jika anda belum melengkapi Tutorial 1–7, kami mendorong anda meninjau ini sehingga proyek contoh anda cocok satu yang digambarkan dibawah.

## Hal-hal dapat digunakan kembali

Adalah pekerjaan banyak untuk merancang, membangun, mencoba dan merawat aplikasi jaringan. Banyak proyek Phyton dan Django berbagi masalah umum. Bukankah bagus jika kami dapat menyimpan beberapa pekerjaan berulang ini?

Dapat digunakan kembali adalah cara hidup  dalam Python. [The Python Package Index (PyPI)](https://pypi.org/) memiliki jangkauan luas dari paket-paket anda dapat gunakan dalam program Python anda. Periksa [Django Packages](https://djangopackages.org) untuk aplikasi-aplikasi yang dapat digunakan kembali yang anda anda dapat bekerjasama dalam proyek anda. Django itu sendiri merupakan paket biasa Python. Ini berarti bahwa anda dapat mengambil paket Python yang ada atau aplikasi Django dan menyusun mereka kedalam proyek jaringan anda sendiri. Anda hanya butuh menulis bagian yang membuat proyek anda unik.

Mari kita katakan anda sedang memulai proyek baru yang butuh aplikasi jejak pendapat seperti satu yang kite telah kerjakan. Bagaimana anda ingin membuat aplikasi ini dapat digunakan kembali? Untungnya, anda sudah sedang dalam perjalanan. Dalam [Tutorial 1](/id/5.0/intro/tutorial01/), kai lihat bagaimana kami dapat memisahkan jejak pendapat dari URLconf tingkat-proyek menggunakan `include`. Dalam tutorial ini, kami akan mengambil langkah lebih jauh untuk membuat aplikasi lebih mudah digunakan dalam proyek baru dan siap untuk diterbitkan untuk lainnya untuk dipasang dan digunakan.

> **Paket? Aplikasi?**
>
> [package](https://docs.python.org/3/glossary.html#term-package) Python menyediakan cara pengelompokkan terhubung kode Python untuk memudahkan penggunaan kembali. Sebuah paket mengandung satu atau lebih berkas dari kode Python (juga dikenal sebagai "modul").
>
> Sebuah paket dapat diimpor dengan `import foo.bar` atau `from foo import bar`. Untuk direktori (seperti `polls`) untuk membentuk paket, dia harus mengandung berkas khusus `__init__.py`, bahkan jika berkas ini kosong.
>
> Sebuah *aplikasi* Django adalah sebuah paket Python yang khususnya diperuntukkan untuk penggunaan dalam sebuah proyek Django. Sebuah aplikasi mungkin menggunakan kebiasaan umum Django, seperti memiliki submodul `models`, `tests`, `urls`, dan `views`.
>
> Kemudian kami menggunakan istilah *pemaketan* untuk menggambarkan pengolahan dalam membuat paket Phyton mudah untuk lainnya untuk dipasang. Dia dapat sedikit membingungkan, kami tahu.

## Proyek anda dan aplikasi digunakan kembali anda

After the previous tutorials, our project should look like this:

```text
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.png
                style.css
        templates/
            polls/
                detail.html
                index.html
                results.html
        tests.py
        urls.py
        views.py
    templates/
        admin/
            base_site.html
```

Anda membuat `mysite/template` di doc:Tutorial 7 \</intro/tutorial07\>\`, dan polls/templates\` di :doc: Tutorial 3 \</intro/tutorial03\>\`. Sekarang tampak lebih jelas mengapa kita memilih direktori templat yang berbeda untuk project dan aplikasi: semua yang merupakan bagian aplikasi polls di dalam polls\`. Hal ini membuat aplikasi berdiri-sendiri dan lebih mudah untuk membuat projek baru.

Direktori `polls` sekarang dapat disalin kedalam proyek Django baru dan segera digunakan kembali. Dia tidak siap untuk diterbitkan. Untuk itu, kami butuh untuk memaketkan aplikasi agar membuatnya mudah untuk lainnya dipasang.

## Memasang beberapa prasyarat

The current state of Python packaging is a bit muddled with various tools. For
this tutorial, we're going to use [setuptools](https://pypi.org/project/setuptools/) to build our package. It's
the recommended packaging tool (merged with the `distribute` fork). We'll
also be using [pip](https://pypi.org/project/pip/) to install and uninstall it. You should install these
two packages now. If you need help, you can refer to [how to install
Django with pip](/id/5.0/topics/install/#installing-official-release). You can install `setuptools`
the same way.

## Memaketkan aplikasi anda

*Pemaketan* Phyton mengacu pada menyiapkan aplikasi anda di bentuk khusus yang dapat mudah dipasang dan digunakan. Django itu sendiri dipaketkan seperti ini. Untuk aplikasi jecil seperti jejak pendapat, pengolahan ini tidak terlalu sulit.

1. First, create a parent directory for the package, outside of your Django
   project. Call this directory `django-polls`.

   > **Memilih nama dari aplikasi anda**
   >
   > When choosing a name for your package, check PyPI to avoid naming
   > conflicts with existing packages. We recommend using a `django-`
   > prefix for package names, to identify your package as specific to
   > Django, and a corresponding `django_` prefix for your module name. For
   > example, the `django-ratelimit` package contains the
   > `django_ratelimit` module.
   >
   > Label aplikasi (yaitu, bagian akhir dari jalur bertitik ke paket aplikasi) *harus* unik di [`INSTALLED_APPS`](/id/5.0/ref/settings/#std-setting-INSTALLED_APPS). Hindari menggunakan label sama seperti Django [contrib packages](/id/5.0/ref/contrib/), sebagai contoh `auth`, `admin`, or `messages`.
2. Move the `polls` directory into `django-polls` directory, and rename it
   to `django_polls`.
3. Edit `django_polls/apps.py` so that [`name`](/id/5.0/ref/applications/#django.apps.AppConfig.name) refers to the
   new module name and add [`label`](/id/5.0/ref/applications/#django.apps.AppConfig.label) to give a short name for
   the app:

   *`django-polls/django_polls/apps.py`*

   ```python
   from django.apps import AppConfig

   class PollsConfig(AppConfig):
       default_auto_field = "django.db.models.BigAutoField"
       name = "django_polls"
       label = "polls"
   ```
4. Buat berkas `django-polls/README.rst` dengan isi berikut:

   *`django-polls/README.rst`*

   ```rst
   ============
   django-polls
   ============

   django-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 = [
           ...,
           "django_polls",
       ]

   2. Include the polls URLconf in your project urls.py like this::

       path("polls/", include("django_polls.urls")),

   3. Run ``python manage.py migrate`` to create the models.

   4. Start the development server and visit the admin to create a poll.

   5. Visit the ``/polls/`` URL to participate in the poll.
   ```
5. Buat berkas `django-polls/LICENSE`. Memilih lisensi diluar lingkup dari tutorial ini, tetapi mencukupinya untuk dikatakan bahwa kode diterbitkan umum tanpa lisensi adalah *tidak berguna*. Django dan banyak aplikasi Sesuai-Django disebarkan dibawah lisensi BSD; bagaimanapun, anda bebas mengambil lisensi anda sendiri. Hanya waspada bahwa pilihan lisensi anda akan mempengaruhi siapa yang dapat menggunakan kode anda.
6. Selanjutnya kami akan membuat berkas `pyproject.toml`, `setup.cfg`, dan `setup.py` yang merinci bagaimana membangun dan memasang aplikasi. Penjelasan penuh dari berkas ini diluar cakupan tutorial, tetapi [setuptools documentation](https://setuptools.pypa.io/en/latest/) mempunyai penjelasan yang bagus. Buat berkas `django-polls/pyproject.toml`, `django-polls/setup.cfg`, dan `django-polls/setup.py` dengan isi berikut:

   *`django-polls/pyproject.toml`*

   ```toml
   [build-system]
   requires = ['setuptools>=40.8.0']
   build-backend = 'setuptools.build_meta'
   ```

   *`django-polls/setup.cfg`*

   ```ini
   [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.10
       Programming Language :: Python :: 3.11
       Programming Language :: Python :: 3.12
       Topic :: Internet :: WWW/HTTP
       Topic :: Internet :: WWW/HTTP :: Dynamic Content

   [options]
   include_package_data = true
   packages = find:
   python_requires = >=3.10
   install_requires =
       Django >= X.Y  # Replace "X.Y" as appropriate
   ```

   *`django-polls/setup.py`*

   ```python
   from setuptools import setup

   setup()
   ```
7. Only Python modules and packages are included in the package by default. To
   include additional files, we'll need to create a `MANIFEST.in` file. The
   `setuptools` docs referred to in the previous step discuss this file in
   more detail. To include the templates, the `README.rst` and our
   `LICENSE` file, create a file `django-polls/MANIFEST.in` with the
   following contents:

   *`django-polls/MANIFEST.in`*

   ```text
   include LICENSE
   include README.rst
   recursive-include django_polls/static *
   recursive-include django_polls/templates *
   ```
8. It's optional, but recommended, to include detailed documentation with your
   app. Create an empty directory `django-polls/docs` for future
   documentation. Add an additional line to `django-polls/MANIFEST.in`:

   ```text
   recursive-include docs *
   ```

   Catat bahwa direktori `docs` tidak akan disertakan dalam paket anda meskipun anda menambahkan beberapa berkas ke dalamnya. Banyak aplikasi Django juga menyediakan dokumentasi darin mereka melalui situs seperti [readthedocs.org](https://readthedocs.org).
9. Try building your package by running `python setup.py sdist` inside
   `django-polls`. This creates a directory called `dist` and builds your
   new package, `django-polls-0.1.tar.gz`.

Untuk informasi lebih pada pemaketan, lihat [Tutorial on Packaging and Distributing Projects](https://packaging.python.org/tutorials/packaging-projects/)  Python.

## Menggunakan paket anda sendiri

Sejak kami memindahkan direktori `polls` diluar proyek, dia tidak lagi bekerja. Kami akan sekarang memperbaiki ini dengan memasang paket `django-polls` baru.

> **Memasang sebagai pustaka pengguna**
>
> Langkah berikut memasang `django-polls` sebagai pustaka pengguna. Tiap-pengguna pasang mempunyai banyak keuntungan lebih memasang paket lebar-sistem, seperti menjadi berguna di sistem dimana anda tidak mempunyai akses administrator sama halnya mencegah paket dari layanan sistem terpengaruh dan pengguna lain dari mesin.
>
> Catat bahwa per pemasangan pengguna dapat masih mempengaruhi perilaku peralatan sistem yang dijalankan pengguna tersebut, jadi menggunakan lingkunan maya adalah pemecahan yang lebih kokoh (lihat dibawah).

1. To install the package, use pip (you already [installed it](#installing-reusable-apps-prerequisites), right?):

   ```shell
   python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz
   ```
2. Update `mysite/settings.py` to point to the new module name:

   ```
   INSTALLED_APPS = [
       "django_polls.apps.PollsConfig",
       ...,
   ]
   ```
3. Update `mysite/urls.py` to point to the new module name:

   ```
   urlpatterns = [
       path("polls/", include("django_polls.urls")),
       ...,
   ]
   ```
4. Run the development server to confirm the project continues to work.

## Keluarkan aplikasi anda

Sekarang bahwa kita telah memaketkan dan mengujikan `django-polls`, dia sudah siap dibagi dengan dunia! Jika ini bukan contoh, anda dapat melakukannya sekarang:

- Surel paket ke teman.
- Unggah paket di situs jaringan anda.
- Tempatkan paket pada gudang umum, seperti [the Python Package Index (PyPI)](https://pypi.org/). [packaging.python.org](https://packaging.python.org) mempunyai [a good tutorial](https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives) untuk melakukan ini.

## Menginstal paket Python dengan lingkungan virtual

Earlier, we installed `django-polls` as a user library. This has some
disadvantages:

- Merubah pustaka pengguna dapat berakibat perangkat lunak Phyton lain di sistem anda.
- Anda tidak dapat menjalankan versi banyak dari paket ini (atau lainnya dengan nama sama disini).

Khususnya, keadaan ini dapat hanya muncul ketika anda sedang merawat beberapa proyek Django. Ketika mereka melakukannya, pemecahan terbaik adalah menggunakan [venv](https://docs.python.org/3/tutorial/venv.html). Alat ini mengizinkan anda merawat banyak lingkungan Python terpencil, masing-masing dengan salinannya sendiri dari pustaka dan paket namespace.
