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 2024-01-27 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:
creare un modello (classe) per i dati
creare una view per estrapolare i dati
creare un template per formattare i dati
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 migrate
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',
'notes',
)
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:
Registrare la app Admin nel file setting
Abilitare le urlconf per richiamarlo
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
) .