Tutorial avanzato: Come scrivere applicazioni riutilizzabili

Questo tutorial avanzato inizia dove si è interrotto il Tutorial 7. Trasformeremo la nostra applicazione per i questionari web in un package Python standalone da riusare in nuovi progetti e condividere con altre persone.

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à è importante

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.

Package? App?

Un package di Python fornisce una modo di raggruppare codice Python correlato per un riutilizzo piu semplice. Un package contiene uno o piu file scritti in Python ( conosciuti anche come «modules» ).

Un package puo essere importato con import foo.bar oppure from foo import bar. Per una cartella ( come polls) per creare un package, deve contenere un file speciale __init__.py, anche se questo file puo restare vuoto.

Un «applicazione» Django è un package Python che ha lo specifico scopo di essere usato in un progetto Django. Un” applicazione puo” useare convenzioni comuni di Django, come avere models, tests, urls, e views  sottomoduli.

Più tardi usiamo il termine packaging per descrivere il processo di costruire un pacchetto python facile dagli altri per installare. Può essere un pochino confusonario, lo sappiamo

Il tuo progetto e la tua applicazione riutilizzabile

Dopo i tutorial precedenti, il nostro progetto dovrebbe essere cosi

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

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 prerequisiti

Lo stato corrente del packaging di Python è un pochino confuso con vari tool. Per questo tutorial, useremo setuptools per costruire il nostro package. E” il tool di packaging raccomandato (in merge con il fork distribute). Useremo anche pip per installarlo e disinstallarlo. Dovresti installare questi due package ora. Se ti serve aiuto, puoi fare riferimento a come installare Django con pip1. Puoi installare setuptools allo stesso modo.

Pacchettizzare la tua applicazione

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. Primo, crea una directory principale per polls, all’esterno del tuo progetto Django. Nomina questa cartella django-polls.

    Scegli un nome per la tua app

    Quando scegli un nome per il tuo package controlla le risorse come PyPI per evitare di generare conflitti con i nomi di packages esistenti. E” convenzione anteporre «django-» al nome del tuo modulo quando si crea un package da distribuire. Questo aiuta le persone alla ricerca di applicazioni per Django a identificare la tua come specifica per Django.

    L” etichetta dell” applicazione (cioè, la parte finale del percorso puntato al package dell’applicazione) deve essere unica in INSTALLED_APPS. Evita di usare le stesse etichette di uno degli Django contrib packages, per esempio auth, admin, o messages.

  2. Sposta la cartella polls nella cartella django-polls.

  3. Crea un file django-polls/README.rst con il seguente contenuto:

    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. 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.

  5. Next we’ll create pyproject.toml, setup.cfg, and setup.py files which detail how to build and install the app. A full explanation of these files is beyond the scope of this tutorial, but the setuptools documentation has a good explanation. Create the django-polls/pyproject.toml, django-polls/setup.cfg, and django-polls/setup.py files with the following contents:

    django-polls/pyproject.toml
    [build-system]
    requires = ['setuptools>=40.8.0', 'wheel']
    build-backend = 'setuptools.build_meta:__legacy__'
    
    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
    
    django-polls/setup.py
    from setuptools import setup
    
    setup()
    
  6. Solo i moduli ed i package di Python sono inclusi nel package di default. Per includere altri file, abbiamo bisogno di creare un file MANIFEST.in. I documenti setuptools ai quali si è fatto riferimento nello step precedente, discutono questo file più nel dettaglio. Per includere i template, il file README.rst ed il nostro file LICENSE, crea un file django-polls/MANIFEST.in con i seguenti contenuti:

    django-polls/MANIFEST.in
    include LICENSE
    include README.rst
    recursive-include polls/static *
    recursive-include polls/templates *
    
  7. Non è obbligatorio, ma si raccomanda, di includere una documentazione dettagliata con l’app. Crea una directory vuota django-polls/docs per la futura documentazione. Aggiungi una linea in django-polls/MANIFEST.in:

    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.

  8. Prova a fare una build del tuo package con python setup.py sdist` (lancialo in django-polls). Questo crea una directory chiamata dist e costruisce il tuo nuovo 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 pacchetto

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.

Installando una libreria utente

I seguenti step installano django-polls come libreria utente. Le installazioni «per utente» hanno molti vantaggi rispetto a quelle di sistema, come per esempio il fatto di poter essere utilizzate su sistemi dove non si ha accesso di amministrazione così come il fatto che l’utilizzo del package non ha effetto sui servizi del sistema o sugli altri utenti della macchina.

Nota che le installazioni «per utente» possono ancora avere effetto sul comportamento di quei tool di sistema che sono lanciati da quell’utente, quindi utilizzare un virtual environment è una soluzione più robusta (vedi sotto).

  1. Per installare il package, usa pip (lo ha già installato, giusto?):

    python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz
    
  2. Con un pizzico di fortuna, il tuo progetto Django ora dovrebbe nuovamente funzionare correttamente. Esegui il server di nuovo per confermare.

  3. Per disinstallare il package, usare pip:

    python -m pip uninstall django-polls
    

Pubblicare la tua applicazione

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 virtuale

Prima, abbiamo installato la app polls come una libreria utente. Questo però ha dei svantaggi:

  • 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.

Back to Top