Tutorial avanzato: Come scrivere applicazioni riutilizzabiliLink to this heading

This advanced tutorial begins where Tutorial 8 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.

Se non hai completato di recente i Tutorial 1–7, ti invitiamo a rivederli in modo che il tuo progetto di esempio corrisponda a quello descritto di seguito.

La riusabilità è importanteLink to this heading

Ci vuole molto lavoro per progettare, costruire, testare e manutenere una applicazione web. Alcuni progetti in Python e Django condividono problemi comuni. Non sarebbe fantastico se potessimo risparmiare parte di questo lavoro ripetuto?

La riusabilità è uno stile di vita in Python. Il Python Package Index (PyPI) <https://pypi.org/> offre una vasta gamma di package che puoi usare nei tuoi programmi Python. Dai un’occhiata agli Django Packages per trovare app riutilizzabili da incorporare nei tuoi progetti. Django stesso è un normale package. Questo significa che puoi prendere package Django esistenti o app Django e comporli nel tuo progetto web. Devi solo scrivere le parti che rendono il tuo progetto unico.

Diciamo che tu stia iniziando un nuovo progetto che necessita di una applicazione di questionari come quella su cui abbiamo lavorato. Come rendi quest’app riutilizzabile? Fortunatamente, sei già un passo avanti. Nel Tutorial 1, abbiamo detto come disaccoppiare polls dalla configurazione delle URL a livello di progetto usando include. In questo tutorial, faremo altri passi per rendere l’app facilmente utilizzabile in progetti nuovi e pronta da pubblicare affinchè altri possano installarla ed usarla.

Il tuo progetto e la tua applicazione riutilizzabileLink to this heading

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

Hai creato mysite/templates in Tutorial 7 </intro/tutorial07> e `polls/templates` in :doc:`Tutorial 3 </intro/tutorial03>. Ora forse è più chiaro perchè abbiamo scelto di separare le directories con i template tra progetto e applicazione: tutto ciò che fa parte dell’applicazione «polls» è dentro «polls». Questo rende l’applicazione più facile da rilasciare in un nuovo progetto poichè contiene tutte le informazioni dentro di se.

La directory polls può essere copiata in un nuovo progetto Django e immediatamente riutilizzata. Non è completamente pronta per essere pubblicata. Per questo, dobbiamo creare un pacchetto dall’app per semplificare l’installazione da parte di altri.

Installazione di alcuni prerequisitiLink to this heading

The current state of Python packaging is a bit muddled with various tools. For this tutorial, we’re going to use setuptools to build our package. It’s the recommended packaging tool (merged with the distribute fork). We’ll also be using 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. You can install setuptools the same way.

Pacchettizzare la tua applicazioneLink to this heading

Il packaging Python si riferisce al preparare la tua app in un formato specifico che può essere facilmente installato e riutilizzato. Django stesso è «impacchettato» così. Per piccole app come polls, è un processo non molto difficile.

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

  2. Move the polls directory into django-polls directory, and rename it to django_polls.

  3. Edit django_polls/apps.py so that name refers to the new module name and add 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. Crea un file django-polls/README.rst con il seguente contenuto:

    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. Crea un file ``django-polls/LICENSE`. Scegliere una licenza è oltre lo scopo di questo tutorial, ma è sufficiente dire che il codice rilasciato pubblicamente senza licenza è inutile. Django e molte app Django-compatibili sono distribuite sotto la licenza BSD; comunque, sei libero di scegliere la licenza che preferisci. Sii solo consapevole che la licenza che scegli influenzerà anche quelli che usano il tuo codice.

  6. Poi creeremo i file pyproject.toml, setup.cfg e setup.py``che dettagliano come fare la build dell'app e come installarla. Una spiegazione piena di questi file è oltre le finalità di questo tutorial ma la `docuementazione di setuptools <https://setuptools.pypa.io/en/latest/>`_ ne una esauriente. Crea i file ``django-polls/pyproject.toml, django-polls/setup.cfg, and django-polls/setup.py con i seguenti contenuti:

    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 *
    

    Nota che la directory docs non verrà inclusa nel tuo package finchè non ci aggiungi dei file. Molte Django app offrono la loro documentazione online anche attraverso siti come 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.

Per ulteriori informazioni sul packaging, vedi il tutorial di Python Tutorial sul Packaging e la Distribuzione di Progetti.

Utilizzare il tuo pacchettoLink to this heading

Dato che abbiamo spostato la cartella polls fuori dal nostro progetto, non funziona più. Possiamo sistemare questo problema, installando il nuovo nostro package django-polls.

  1. To install the package, use pip (you already installed it, 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:

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

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

Pubblicare la tua applicazioneLink to this heading

Ora che abbiamo creato e testato il package django-polls, è pronto per essere condiviso con il mondo! Se questo non era solo un esempio, potresti fare ora:

Installazione di pacchetti Python con un ambiente virtualeLink to this heading

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

  • Modificare le librerie delle utenze può danneggiare altri software Python installati nel tuo sistema.

  • Non sarai in grado di eseguire multiple versioni di questo pacchetto ( o altri con lo stesso nome ).

Tipicamente, queste situazioni accadono quando manutieni svariati progetti Django. In questo caso, la miglior soluzione è usare venv. Questo tool ti permette di mantenere più ambienti Python isolati, ognuno con la propria copia delle librerie ed un namespace proprio.