CherryPy: una aplicación funcional

Las aplicaciones de pila completa brindan la posibilidad de crear una nueva aplicación a través de algún comando o ejecución del archivo.

Considere las aplicaciones de Python como el framework web2py; todo el proyecto / aplicación se crea en términos del marco MVC. Asimismo, CherryPy permite al usuario configurar y configurar el diseño del código según sus requisitos.

En este capítulo, aprenderemos en detalle cómo crear una aplicación CherryPy y ejecutarla.

Sistema de archivos

El sistema de archivos de la aplicación se muestra en la siguiente captura de pantalla:

Aquí hay una breve descripción de los diversos archivos que tenemos en el sistema de archivos:

  • config.py- Cada aplicación necesita un archivo de configuración y una forma de cargarlo. Esta funcionalidad se puede definir en config.py.

  • controllers.py- MVC es un patrón de diseño popular seguido por los usuarios. El controllers.py es donde se implementan todos los objetos que se montarán en el cherrypy.tree .

  • models.py - Este archivo interactúa con la base de datos directamente para algunos servicios o para almacenar datos persistentes.

  • server.py - Este archivo interactúa con el servidor web listo para producción que funciona correctamente con el proxy de equilibrio de carga.

  • Static - Incluye todos los archivos CSS y de imagen.

  • Views - Incluye todos los archivos de plantilla para una aplicación determinada.

Ejemplo

Aprendamos en detalle los pasos para crear una aplicación CherryPy.

Step 1 - Cree una aplicación que debe contener la aplicación.

Step 2- Dentro del directorio, cree un paquete de Python correspondiente al proyecto. Cree el directorio gedit e incluya el archivo _init_.py dentro del mismo.

Step 3 - Dentro del paquete, incluya el archivo controllers.py con el siguiente contenido -

#!/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- Considere una aplicación donde el usuario ingresa el valor a través de un formulario. Incluyamos dos formularios: index.html y submit.html en la aplicación.

Step 5 - En el código anterior para controladores, tenemos index(), que es una función predeterminada y se carga primero si se llama a un controlador en particular.

Step 6 - La implementación de la index() El método se puede cambiar de la siguiente manera:

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

Step 7- Esto cargará index.html al iniciar la aplicación dada y la dirigirá al flujo de salida dado. El archivo index.html es el siguiente:

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 - Es importante agregar un método a la clase Root en controller.py si desea crear un formulario que acepte valores como nombres y títulos.

@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 - El código que se incluirá en submit.html es el siguiente:

<!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 - Recibirá el siguiente resultado -

Aquí, el nombre del método se define como "POST". Siempre es importante realizar una verificación cruzada del método especificado en el archivo. Si el método incluye el método "POST", los valores deben volver a comprobarse en la base de datos en los campos correspondientes.

Si el método incluye el método "GET", los valores a guardar serán visibles en la URL.