Abbiamo visto come l'URL http://localhost:8000 genera una chiamata al metodo index della classe Root
. L'URL http://localhost:8000/viewResult genera una chiamata al metodo viewResult della classe Root.
- Come funzione questa 'magia'?
- Sappiamo che non possiamo chiamare il metodo di una classe. Dovremmo chiamare il metodo come una istanza
di una classe. Come si spiega quindi?
- Cosa succede quando digito l'URL http://localhost:8000/dir1/dir2/dir3/page ?
Rispondiamo a queste domande:
Prima di tutto, quando dichiarate nel file sorgente una CherryClass:
CherryPy ( o per essere più precisi: l'eseguibile generato da CherryPy) automaticamente creerà
un'istanza di questa classe, chiamata className. Questo è il nome della classe con la prima
lettera del nome minuscola. (Questa è la ragione per cui i nomi delle classi CherryPy dovrebbero
sempre iniziare con una lettera maiuscola)
Questa istanza è una variabile globale che è accessibile da qualsiasi parte del programma.
Basandosi sull'URL, come fa CherryPy a conoscere quale metodo di quale istanza di classe chiamare?
Usa un semplice meccanismo:
Per l'URL host/dir1/dir2/dir3/page, chiamerà il metodo dir1_dir2_dir3.page().
Così si aspetterà che il vostro programma abbia un classe CherryClass chiamata Dir1_dir2_dir3,
che dovrebbe avere un metodo chiamato page.
Ci sono 2 casi speciali:
- se non c'è prima una directory (in altre parole, l'URL ha la forma: host/page), verrà chiamato il
metodo root.page(). Il che significa che entrambi gli URL host/page e host/root/page
sono perfettamente equivalenti.
- se non c'e' prima una directory o nessuna pagina (in altre parole, l'URL è il solo hostname), verrà allora chiamato il metodo root.index().
Importante: In CherryPy-0.9, è stata aggiunta una nuova caratteristica: se viene richiesta la pagina http://localhost:8000/dir1/dir2/dir3
, CherryPy prima convertirà la chiamata in dir1_dir2.dir3(), aspettandosi quindi un metodo dir3
nella classe CherryClass Dir1_dir2.
Ma se tale metodo non esiste, verrà cercato un metodo index nella classe CherryClass Dir1_dir2_dir3. (che potrebbe anche corrispondere a http://localhost:8000/dir1/dir2/dir3/index).
Nel prossimo capitolo vedremo come usare l'ereditarietà quando abbiamo moduli simili all'interno di un sito web...
See About this document... for information on suggesting changes.