L'ordine con cui definiamo le espressioni regolari nel file urls.py
è molto importante, in quanto il server invoca il modulo Python della prima espressione regolare soddisfatta dalla richiesta.
Esaminiamo questa dichiarazione:
urlpatterns = patterns('', (r'^app/', 'miosito.app.views.index'), (r'^app/form/', 'miosito.app.views.form'), )
La richiesta app/form/
soddisfa l'espressione regolare ^app/
, quindi sarà invocato sempre il modulo miosito.app.views.index
, nonostante l'espressione regolare successiva sia più simile alla richiesta che il server ha ricevuto. Per ottenere l'accesso alla View form
dobbiamo quindi invertire l'ordine delle definizioni.
urlpatterns = patterns('', (r'^app/form/', 'miosito.app.views.form'), (r'^app/', 'miosito.app.views.index'), )
Messaggi HTTP
Vediamo ora come impostare una View che restituisca messaggi HTTP. Possiamo utilizzare delle sottoclassi di HttpResponse:
- HttpResponseNotFound, per restituire la pagina Page Not Found (404)
- HttpResponseForbidden, per restituire la pagina Forbidden (403)
- HttpResponseServerError, per restituire la pagina Server Error (500)
facendo restituire alla view un'istanza di tali classi invece di HttpResponse. Vediamo subito un esempio pratico per capire come si utilizzano.
def vista(request): #... errore = ... if errore: return HttpResponseNotFound('<h1>Pagina non trovata </h1>') else: # ...
Notiamo che anche le sottoclassi di HttpResponse necessitano del codice HTML da restituire; per comodità Django prevede un altro metodo per gestire l'errore HTTP 404: se in qualsiasi punto del codice si lancia un'eccezione Http404 (raise Http404), Django la cattura e restituisce la pagina Page Not Found standard.