1   Introduzione a django

Introduzione allo sviluppo per Django. Il work flow di una applicazione web MVC: Modello, Controller, View.

Author:Andrea Manni
Copyright:GFDL
Version:0.1

Questi appunti sono ad uso privato.

Generato il 2015-05-14 con: http://docutils.sourceforge.net/rst.html

1.1   Componenti

Django e’ un MVC Model-View-Controller, per creare una applicazione procederemo nel seguente modo:

  1. creare un modello (classe) per i dati
  2. creare una view per estrapolare i dati
  3. creare un template per formattare i dati
  4. creare una urlconf per collegare la view a una richiesta http

Per poter iniziare i lavori dovremo prima di tutto creare un progetto, e una prima applicazione all’inteno di questo:

django-admin startproject intro
cd intro/
python manage.py startapp notes

Ogni progetto e’ il contenitore di piu’ appicazioni, le applicazioni sono le unita’ che svolgono determinati compiti (un progetto per un sito, una app per le news, una app per i contatti, una app per il catalogo,...) Ogni progetto ha un file settings.py per la configurazione dei parametri usati da tutte le app in esso contenuto. Ora configuriamo il file settings.py per abilitare un database:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/root/django/intro/intro.sqlite',
        ...
TIME_ZONE = 'Europe/Rome'

LANGUAGE_CODE = 'it'

Fatto questo facciamo creare a django il database:

python manage.py syncdb

Django crea in automatico anche le tabelle per la gestione degli utenti e dei siti dato che queste applicazioni sono abilitate di default.

1.1.1   Model

I modelli definiscono le strutture di dati, creiamo il modello notes nel model.py dell’applicazione notes: notes/models.py:

from django.db import models

class Note(models.Model):
        title           = models.CharField(max_length=200)
        text            = models.TextField()

        def __unicode__(self):
                return self.title

Per creare la tabella dobbiamo registrare l’applicazione notes in settings.py:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'notes',
)

Ora validiamo e creiamo il database:

python manage.py validate
python manage.py sql notes
python manage.py syncdb

Note

Viene creato automaticamente un campo id per la tabella.

1.1.1.1   Popolazione del db

Per semplificare lo sviluppo inseriamo un paio di record dentro la tabella notes via sql:

python manage.py dbshell
.schema notes_note
insert into notes_note values('1','Prima news',"Questo e' il testo semplice della prima news, solo per esempio.");
insert into notes_note values('2','Seconda news',"Questo e' il testo semplice della seconda news, solo per esempio.");
insert into notes_note values('3','Terza news',"Questo e' il testo semplice della terza news, solo per esempio.");

Avremmo potuto popolare il db utilizzandno direttamente la API fornita da django, o l’interfaccia Admin preconfezionata.

1.1.2   View

La view prepara i dati che verranno passati alla pagina HTML, utilizzeremo lo shortcut render_te_rensonse che popola un template con un dizionario per produrre un ogetto HttpResponse

from django.shortcuts   import render_to_response
from notes.model        import Note

def index(request):
        note_list = Note.objects.all()
        return render_to_response('notes/index.html', {'note_list': note_list})

Utilizziamo direttamente render_to_response per poter usare il sistema di template di django. Avremmo potuto evitare di creare la view index utilizzando una simple view dato che passiamo tutto il contenuto della tabella notes_note senza particolar modifiche.

1.1.3   Template

Tramite un template prepariamo la pagina html che andra’ a visualizare i dati. Nella cartella del progetto creiamo una cartella templates/notes/ in cui faremo il file index.html

<h1>Elenco Note</h1>
<p>Elenco delle note disponibili al momento</p>
<ol>
    {% for note in note_list %}
    <li><a href="/notes/{{ note.id }}/">{{ note.title }}</a>{{ note.text ))</li>
    {% endfor %}
</ol>

Dovremo poi includere il percorso alla cartella template in settings.py:

TEMPLATE_DIRS = (
    '/root/django/intro/templates',

    ...

1.1.4   Urlconf

In ultimo creaiamo un url conf che permettera’ di attivare la nostra view alla richiesta di una determinata URL (routing delle richieste HTTP):

url(r'^notes/i$', 'notes.views.index'),

Note

Notes has no capital letter!

1.1.5   Test

Per testare il corretto funzionameto lanciamo il server di sviluppo e richiediamo l’url: ‘’http://127.0.0.1:8000/notes/`` , dovremmo ottenere dell’HTML simile a:

<h1>Elenco Note</h1>
<p>This is the list of available notes atm</p>
<ol>
    <li><a href="/notes/1/">Prima news</a></li>
    <li><a href="/notes/2/">Seconda news</a></li>
    <li><a href="/notes/3/">Terza news</a></li>
</ol>

1.2   Notes

Questo e’ in sintesi il work-flow dell’applicazione. Si tenga presente che per l’inserimento dei dati e’ disponibile l’interfaccia Admin che mette a disposizione degli utenti un CRUD personalizzabile, oppure la API a riga di comando richiamabile con python manage.py shell .

  • La view utilizzata e’ sostituibile da una simple view.
  • Tutti i path sono stati HARD CODED nella applicazione, questo e’ ovviamente da evitare usando un varabile o magari di ambiente.

1.3   Abilitare l’ADMIN

L’admin e’ l’iterfaccia pre preconfezinata per la gestione del backoffice. Per abilitarla servono alcuni passaggi:

  1. Registrare la app Admin nel file setting
  2. Abilitare le urlconf per richiamarlo
  3. Creare un file admin.py in ogni app in cui impostare il comportamente dell’app per le varie classi.

I primi due punti richiedono solo di de-commentare le voci gia’ incluse nei rispettivi file:

1.3.1   settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin'

1.3.2   urls.py

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),

1.4   Webserver

Django permette grande flessibilita’ per lo sviluppo e il testing della propria app. L’installaione di default include un web server adatto allo sviluppo e il test in locale, invocabile direttamente dall’interprete:

python mange.py runserver

Uno step sucessivo puo’ essere Gunicorn: un micro web server multi threading scritto in python. Puo’ essere la soluzione ideale per una apllicazione che deve girare all’interno di una intranet, evitandoci di dover installare un vero e prorio webserver. Gunicorn si integra con Django e puo’ essere anch’esso contenuto in un virtualenv rendendo cosi’ triviale il deployment dopo lo sviluppo.

easy_install gunicorn
# installare gunicorn nel virtual env
cd django/app/path
gunicorn_django

Oppure integrare direttamente gunicorn dentro Django:

INSTALLED_APPS = (
    ...
        "gunicorn",
        )

Quindi potremo usare direttamente:

cwaboutpython manage.py run_gunicorn

1.5   Generic views

Le generic views semplificano la creazione di quelle query / view comuni a molte applicazioni: recuperare l’elenco dei record, il dettaglio di un record, creare, modificare, inserire oggetti.

Vediamo una view per una pagina statica basata su un template: bastera’ intervenire sul vile urls.py:

from django.conf.urls import patterns, url, include
from django.views.generic import TemplateView

urlpatterns = patterns('',
    (r'^about/', TemplateView.as_view(template_name="about.html")),
    )

1.6   Templates

Inserire nel file setting.py il percorso di una o piu’ cartelle che conterranno i templates:

# Personal setting
        PATH = '/root/django/home/'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    PATH + "home/templates",
)

1.7   Url

Per includere nel file urls.py principale le urls di singole app:

urlpatterns = patterns('',
    # Includes for other apps:
     url(r'^notes/', include('notes.urls')),

All’interno delle singole app (nella loro cartella) avremo un file urls.py relativo alla singola app:

from django.conf.urls import patterns, include, url
from django.views.generic import TemplateView, ListView

from notes.models import Note


urlpatterns = patterns('',
    (r'^about/', TemplateView.as_view(template_name="about.html")),
    (r'^notes/$', ListView.as_view(model=Note,
                    )),
)

La ListView fa riferimento al modello Note quindi cerchera’ di default un template notes/note_list.html (app_name/model_list.html) .