CherryPy - Un'applicazione funzionante

Le applicazioni full stack forniscono una funzione per creare una nuova applicazione tramite un comando o l'esecuzione del file.

Considera le applicazioni Python come il framework web2py; l'intero progetto / applicazione è creato in termini di framework MVC. Allo stesso modo, CherryPy consente all'utente di impostare e configurare il layout del codice secondo le proprie esigenze.

In questo capitolo impareremo in dettaglio come creare l'applicazione CherryPy ed eseguirla.

File System

Il file system dell'applicazione è mostrato nella seguente schermata:

Ecco una breve descrizione dei vari file che abbiamo nel file system:

  • config.py- Ogni applicazione necessita di un file di configurazione e di un modo per caricarlo. Questa funzionalità può essere definita in config.py.

  • controllers.py- MVC è un modello di progettazione popolare seguito dagli utenti. Il controller.py è dove vengono implementati tutti gli oggetti che verranno montati su cherrypy.tree .

  • models.py - Questo file interagisce direttamente con il database per alcuni servizi o per la memorizzazione di dati persistenti.

  • server.py - Questo file interagisce con il server Web pronto per la produzione che funziona correttamente con il proxy di bilanciamento del carico.

  • Static - Include tutti i file CSS e di immagine.

  • Views - Include tutti i file modello per una determinata applicazione.

Esempio

Impariamo in dettaglio i passaggi per creare un'applicazione CherryPy.

Step 1 - Creare un'applicazione che dovrebbe contenere l'applicazione.

Step 2- All'interno della directory, crea un pacchetto python corrispondente al progetto. Crea la directory gedit e includi il file _init_.py nella stessa.

Step 3 - All'interno del pacchetto, includi il file controllers.py con il seguente contenuto:

#!/usr/bin/env python

import cherrypy

class Root(object):

   def __init__(self, data):
      self.data = data

   @cherrypy.expose
   def index(self):
      return 'Hi! Welcome to your application'

def main(filename):
   data = {} # will be replaced with proper functionality later

   # configuration file
   cherrypy.config.update({
      'tools.encode.on': True, 'tools.encode.encoding': 'utf-8',
      'tools.decode.on': True,
      'tools.trailing_slash.on': True,
      'tools.staticdir.root': os.path.abspath(os.path.dirname(__file__)),
   })

   cherrypy.quickstart(Root(data), '/', {
      '/media': {
         'tools.staticdir.on': True,
         'tools.staticdir.dir': 'static'
      }
   })
	
if __name__ == '__main__':
main(sys.argv[1])

Step 4- Considera un'applicazione in cui l'utente inserisce il valore tramite un modulo. Includiamo due moduli: index.html e submit.html nell'applicazione.

Step 5 - Nel codice sopra per i controller, abbiamo index(), che è una funzione predefinita e viene caricata per prima se viene chiamato un determinato controller.

Step 6 - L'implementazione del index() il metodo può essere modificato nel modo seguente:

@cherrypy.expose
   def index(self):
      tmpl = loader.load('index.html')
	 
      return tmpl.generate(title='Sample').render('html', doctype='html')

Step 7- Questo caricherà index.html all'avvio dell'applicazione data e lo indirizzerà al flusso di output specificato. Il file index.html è il seguente:

index.html

<!DOCTYPE html >
<html>
   <head>
      <title>Sample</title>
   </head>
	
   <body class = "index">
      <div id = "header">
         <h1>Sample Application</h1>
      </div>
		
      <p>Welcome!</p>
		
      <div id = "footer">
         <hr>
      </div>
		
   </body>
	
</html>

Step 8 - È importante aggiungere un metodo alla classe Root in controller.py se vuoi creare un modulo che accetti valori come nomi e titoli.

@cherrypy.expose
   def submit(self, cancel = False, **value):
	
      if cherrypy.request.method == 'POST':
         if cancel:
            raise cherrypy.HTTPRedirect('/') # to cancel the action
         link = Link(**value)
         self.data[link.id] = link
         raise cherrypy.HTTPRedirect('/')
      tmp = loader.load('submit.html')
      streamValue = tmp.generate()
		
      return streamValue.render('html', doctype='html')

Step 9 - Il codice da includere in submit.html è il seguente -

<!DOCTYPE html>
   <head>
      <title>Input the new link</title>
   </head>
	
   <body class = "submit">
      <div id = " header">
         <h1>Submit new link</h1>
      </div>
		
      <form action = "" method = "post">
         <table summary = "">
            <tr>
               <th><label for = " username">Your name:</label></th>
               <td><input type = " text" id = " username" name = " username" /></td>
            </tr>
				
            <tr>
               <th><label for = " url">Link URL:</label></th>
               <td><input type = " text" id=" url" name= " url" /></td>
            </tr>
				
            <tr>
               <th><label for = " title">Title:</label></th>
               <td><input type = " text" name = " title" /></td>
            </tr>
				
            <tr>
               <td></td>
               <td>
                  <input type = " submit" value = " Submit" />
                  <input type = " submit" name = " cancel" value = "Cancel" />
               </td>
            </tr>
				
         </table>
			
      </form>
      <div id = "footer">
      </div>
		
   </body>
	
</html>

Step 10 - Riceverai il seguente output -

Qui, il nome del metodo è definito come "POST". È sempre importante effettuare una verifica incrociata del metodo specificato nel file. Se il metodo include il metodo "POST", i valori devono essere ricontrollati nel database nei campi appropriati.

Se il metodo include il metodo "GET", i valori da salvare saranno visibili nell'URL.