ff-multiconverter, multimedia, audio, video, linux, ubuntu ubuntu kylin, china, releases, linux terminal, ubuntu, linux, comandos, shell conky, gadgets, ubuntu, linux SpeedTest-Cli, velocidad, red, consola, terminal tag foto 6 pinta, grafica, linux, ubuntu djl, juegos, yum, synaptic, paquetes ubuntu, releases, canonical psensor, ubuntu, linux, sistema, monitor
Mostrando las entradas con la etiqueta Guias y Tutoriales. Mostrar todas las entradas

Guía de Dr. GEO: nociones preliminares.

Dr. Geo es un programa tanto de geometría interactiva como de programación en el lenguaje Scheme.
Permite crear figuras geométricas, así como manipularlas interactivamente respetando sus restricciones geométricas. Se puede trabajar con: semirrectas, segmentos, círculos, arcos de círculo, polígonos, transformaciones geométricas, lugares geométricos, vectores, ángulos, etc.
Para comprender visualmente algunos conceptos importantes como: números irracionales, cálculo de Pi, etc.
dr geo

Inkscape tutorial: conceptos básicos (2a parte).

Cada objeto individual dentro de una selección muestra una señal de selección — por defecto, un marco rectángular. Estos marcos hacen más sencillo el observar que está selccionado y que no loo está. Por ejemplo, si selecciona ambas elipses y el rectágulo, sin los marcos le sería muy difícil adivinar cual de las elipses están seleccionadas y cuales no.
Inkscape_0.44_promotional_banner

Inkscape tutorial: conceptos básicos (1a parte).

El tutorial Básico cubre la navegación en canvas (pizarra), manejo de documentos, herramientas de formas básicas, técnicas de selección, transformación de objetos por medio del selector, agrupado, configuración de relleno y borde, alineación y orden-z. Para visualizar otros temas más avanzados, ingrese al menú Ayuda.
inkscape


Guia básica para el uso de Ubuntu 14.04 “Trusty Tahr”: cómo instalar los codecs multimedia.

Ubuntu, por defecto, tan sólo trabaja con formatos multimedia libres. Por desgracia, la mayoría de los formatos más populares no lo son. A continuación se detalla cómo poder reproducirlos.
Algunos usuarios han constatado que algunas instrucciones de esta guía no funcionan del todo bien en equipos con procesadores de 64 bits. Por tanto, estos consejos son sólo para usuarios de 32 bits.
codecs multimedia

Guia básica para el uso de Ubuntu 14.04 “Trusty Tahr”: adiós Unity bienvenido Gnome.

Lo siento, pero no lo soporto más, he intentado trabajar con Unity pero ya no estoy dispuesto a darle más oportunidades.

Reconozco que han hecho una gran labor para conseguir que Unity funcione así en tan corto espacio de tiempo, pero aún así me parece demasiado engorroso y poco funcional.

Sin dejar de lado el hecho que muchos PC quedan al margen porque no soportan tècnicamente la nueva aplicación de Canonical pensada para ordenadores de última (o muy avanzada) generación.
gnome-canonical

Guia básica para el uso de Ubuntu 14.04 “Trusty Tahr”: instalación avanzada (sistemas UEFI).

UEFI en esencia es una tecnología que está diseñada para reemplazar al estándar IBM PC BIOS.
UEFI está diseñada para ser más flexible y rápida que su contraparte IBM PC BIOS.

Originalmente UEFI fue diseñada por Intel (EFI), pero ha evolucionado hasta convertirse en UEFI, la cual es respaldada por la Unified EFI Forum (corporación sin fines de lucro), además de empresas como AMD, American Megatrends, Apple Computer, Dell, Hewlett Packard, IBM, Insyde, Intel, Lenovo, Microsoft y Phoenix Technologies.
uefi-sb

Cómo instalar y configurar en Ubuntu la nueva suite ofimática de Kingsoft, llamada WPOffice.

 
Hoy voy a informarles cómo instalar y configurar en Ubuntu la nueva suite ofimática de Kingsoft, llamada WPOffice, un proyecto chino que ha tenido fuerte impacto y se está constituyendo como una alternativa real a Libreoffice.
La página oficial del proyecto es aquí.
Kingsoft-Office-5.5.4
Si bien Libreoffice es la más completa y fiable alternativa a MS Office dentro del mundo open-source y Linux, desde el punto de vista estético puede dejar bastante que desear según algunos usuarios. Instalando Kingsoft Office (Aplha 11)
Más allá de los futuros cambios que se vienen en Libreoffice, como el nuevo panel lateral, está claro que Kingsoft quiere ir mucho más allá de lo que fueron sus predecesores.
Kingsoft Office multiplica la apuesta con todo, proponiendo un estilo visual bien ajustado al 2013 y una fuerte compatibilidad para abrir documentos creados con las últimas versiones del paquete Office de Microsoft.
office
Los tres componentes de WPOffice: Writer, Presentation y Spreadsheet.
Kingsoft
Podría decirse que los puntos más cuidados de Kingsoft Office son su aspecto y su velocidad. Es realmente muy rápido.
Además de eso, destacaría como punto positivo la cantidad de trabajo orientado al desarrollo de la suite. El reflejo de ello es que hemos estado viendo actualizaciones de alta envergadura realizadas en períodos de tiempo cortísimos, lo que pone en WPOffice la promesa de transformarse en un programa muy importante e innovativo dentro del mundo linuxero.
Vale aclarar, WPO no es open-source, pero sí gratis, y también multiplataforma.
Linux
Los cambios en la última actualización (Alpha 11).
Hace unos pocos días salió la última actualización Alpha 11 Patch 1 (A11P1), que cuenta con numerosos e interesantes cambios. Dentro de las novedades destacaría que han traducido toda la interfaz al inglés (si alguien probó el programa en sus versiones previas, sabe que la mitad de los menúes aún estaba en chino).
El segundo gran cambio tiene que ver con su interfaz, ya que han aplicado un nuevo y agradable tema que se llama “Ongmani”, con un look fresco y bien diseñado. Mantuvieron otros dos temas -uno tipo office 2003 en el que se pueden cambiar los colores y otro tipo celestito que emula a Metro de Windows 8-, pero descartaron el que se parecía a Microsoft Office 2007. Por último, esta nueva versión involucra mejoras de usabilidad de todos los componentes. Sobre todo, la propuesta de tipo Powerpoint se lleva todos los laureles: es realmente muy interesante y merece ser probada.

Para instalar la suite tienen que pegar este comando en la terminal:
wget http://wdl.cache.ijinshan.com/wps/download/Linux/unstable/kingsoft-office_9.1.0.4096~a11p1_i386.deb && sudo dpkg -i kingsoft-office_9.1.0.4096~a11p1_i386.deb && rm kingsoft-office_9.1.0.4096~a11p1_i386.deb

Cuando el programa arranque por primera vez les pedirá seleccionar el idioma, si no saben chino, (^_^) ahí pueden seleccionar ingles (antes había que hacer peripecias locas para ponerlo -mitad- en inglés). Un detalle: una vez abierto WPoffice verán que la página de inicio no es un documento en blanco sino el sitio web de la suite. Para cambiarlo, tienen que hacer click en el botón principal (arriba a la izquierda) e ir a opciones.
china
Luego, dentro de la sección “General and Save”, seleccionan “New Document” haciendo tick de abajo de todo.
Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Los 10 artículos más leídos en El Mundo de Ubuntu en el mes de Setiembre de 2013.

1.- Cómo instalar y configurar Fail2ban en Debian.
fail2ban
Fail2ban es una aplicación escrita en Python para la prevención de intrusos en un sistema, que se basa en la penalización de conexión (bloquear conexión) a los orígenes que intentan accesos por fuerza bruta. Se distribuye bajo la licencia GNU y típicamente funciona en todos los sistemas POSIX que tengan interfaz con un sistema de control de paquetes o un firewall local.

2.- Cómo agregar el nuevo Google Keep a tu Unity.
google keep
Hace unos días Google lanzo su aplicación oficial para Chrome para su novedoso servicio de notas Keep. Keep para Chrome no se ejecuta como una pestaña en el navegador, ni como una extensión desplegable ya que se trata de una 'aplicación empaquetada', sino que al ser una aplicación semi-nativa se pude usar sin la necesidad del navegador (Chrome no se necesita ejecutar para usarlo) y aparte se puede usar estando offline.

3.- Como hacer un servidor SSH protocolo de comunicación para controlar un ordenador en remoto.
sshSSH (acrónimo del inglés Secure SHell, cuya traducción sería intérprete de comandos seguro) es un protocolo de comunicación para controlar un ordenador en remoto a través de una CLI (Command Line Interface -Interfaz de Línea de Comandos- también llamada: "shell".

4.- Guía PHP: como crear una calculadora básica.
PHP-logo

PHP es un lenguaje de programación de uso general de código del lado del servidor originalmente diseñado para el desarrollo web de contenido dinámico. Fue uno de los primeros lenguajes de programación del lado del servidor que se podían incorporar directamente en el documento HTML en lugar de llamar a un archivo externo que procese los datos.

5.- Bugtroid herramienta innovadora para auditorías en ispositivos móviles.
bugtroid
Bugtroid es una herramienta innovadora desarrollada por el equipo de Bugtraq-Team. Las principales características de esta apk, es que cuenta con más de 200 herramientas de Android y Linux (PRO) para pentesting y forense a través de su Smarthphone o tableta. Tiene un menú categorizado de acuerdo con la naturaleza de la herramienta puede encontrar:
6.- Ubuntu 13.10 “Saucy Salamander” y derivadas disponibles para la descarga.
ubuntu_13.10_fondoHoy es un buen día para todos los usuarios de Ubuntu y distribuciones derivadas de ella, ya que se lanza, como cada 6 meses, una nueva versión con varias correcciones y mejoras y con un soporte oficial de 9 meses más durante el cual se suministrarán actualizaciones de seguridad y correcciones para dicho sistema operativo.

7.- Prueba Ubuntu Phone OS en tu Android.
ubuntu-phone-experience-680x331Desde El Android Libre nos hacemos eco de una noticia interesante para los poseedores de un telefono Android:
“Hemos hablado largo y tendido de Ubuntu en este blog. Sobre todo porque desde el pasado Mobile World Congress se venía desarrollando a gran escala lo que sería un dualboot de Android y Ubuntu. Algo que a muchos nos atrajo por la posibilidad de unir dos sistemas operativos en un solo smartphone. El poder llevar tu teléfono a todas partes con Android y, al llegar a casa enchufarlo en un dock y con sólo una pantalla disfrutar de Ubuntu es una opción muy atractiva. Y es por ello que hemos seguido tanto como hemos podido el desarrollo de Ubuntu by Canonical, hasta el punto de ver al detalle Ubuntu Phone en acción. Un sistema operativo de Ubuntu para móviles que aún sigue dando mucho que hablar.”

8.- Roadmap e incógnitas de Ubuntu 14.04.
ubuntu 14.04 la duda del nombreEl lanzamiento de Ubuntu 14.04, marcado para el 17 de abril de 2014, será el más importante de la historia de Canonical por varias razones que, asimismo, suponen una apuesta arriesgada para la compañía y una incógnita para sus usuarios. Ubuntu 14.04 será un paso de equilibrista en el que la distribución GNU/Linux más popular del mercado desde hace muchos años se la jugará con Mir, su propio servidor gráfico, por defecto. Este es el cambio principal, pero no es el único. La migración a Qt es lenta pero constante, y Canonical sigue trabajando en su ecosistema de ‘apps’.

9.- Comandos específicos para la terminal de Ubuntu.
Terminal comandosAquí les dejo una serie de comandos para la terminal muy útiles a la hora de resolver problemas y realizar consultas, para dar información al que nos va a ayudar.
Si te quedas sin el entorno gráfico, pulsa la combinación de teclas CTRL+ALT+F1 entras en consola, te logeas y ejecuta:
sudo rm -R .gconf
Y vuelve al entorno gráfico con CTRL+ALT+F7.

10.- ¿Qué aplicación consume más ancho de banda?
nethogs2Este artìculo nos muestra cómo saber que aplicación en nuestro ordenador está consumiendo más ancho de banda. Para lograr esto tenemos que instalar una aplicación llamada Nethogs. El funcionamiento de nethogs es sencillo, lo único que tenemos que hacer es ejecutarlo con privilegios de root y especificar la red a monitorizar.
Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Los 10 artículos más leídos en El Mundo de Ubuntu en el mes de Agosto 2013.


1.- ¿Qué aplicación consume más ancho de banda?
nethogs-2
Este artìculo nos muestra cómo saber que aplicación en nuestro ordenador está consumiendo más ancho de banda.Para lograr esto tenemos que instalar una aplicación llamada Nethogs. El funcionamiento de nethogs es sencillo, lo único que tenemos que hacer es ejecutarlo con privilegios de root y especificar la red a monitorizar.

2.- Cómo instalar y configurar Fail2ban en Debian.
fail2ban
Fail2ban es una aplicación escrita en Python para la prevención de intrusos en un sistema, que se basa en la penalización de conexión (bloquear conexión) a los orígenes que intentan accesos por fuerza bruta. Se distribuye bajo la licencia GNU y típicamente funciona en todos los sistemas POSIX que tengan interfaz con un sistema de control de paquetes o un firewall local.

3.- Cómo agregar el nuevo Google Keep a tu Unity.
google keep
Hace unos días Google lanzo su aplicación oficial para Chrome para su novedoso servicio de notas Keep. Keep para Chrome no se ejecuta como una pestaña en el navegador, ni como una extensión desplegable ya que se trata de una 'aplicación empaquetada', sino que al ser una aplicación semi-nativa se pude usar sin la necesidad del navegador (Chrome no se necesita ejecutar para usarlo) y aparte se puede usar estando offline.

4.- Como hacer un servidor SSH protocolo de comunicación para controlar un ordenador en remoto.
sshSSH (acrónimo del inglés Secure SHell, cuya traducción sería intérprete de comandos seguro) es un protocolo de comunicación para controlar un ordenador en remoto a través de una CLI (Command Line Interface -Interfaz de Línea de Comandos- también llamada: "shell".

5.- Guía PHP: como crear una calculadora básica.
PHP-logo

PHP es un lenguaje de programación de uso general de código del lado del servidor originalmente diseñado para el desarrollo web de contenido dinámico. Fue uno de los primeros lenguajes de programación del lado del servidor que se podían incorporar directamente en el documento HTML en lugar de llamar a un archivo externo que procese los datos.

6.- Bugtroid herramienta innovadora para auditorías en dispositivos móviles.
bugtroid
Bugtroid es una herramienta innovadora desarrollada por el equipo de Bugtraq-Team. Las principales características de esta apk, es que cuenta con más de 200 herramientas de Android y Linux (PRO) para pentesting y forense a través de su Smarthphone o tableta. Tiene un menú categorizado de acuerdo con la naturaleza de la herramienta puede encontrar:

7.- Guía de GHex editor hexadecimal de GNOME: preferencias.
ghex-15
Editar.Número máximo de niveles de deshacer Use esta casilla de selección para especificar el número máximo de acciones que puede deshacer. Mostrar el desplazamiento del cursor en la barra de estado como Use esta lista desplegable para seleccionar el formato en el que se mostrará el desplazamiento del cursor. El formato puede ser decimal, hexadecimal o una cadena de estilo de impresión personalizado que sólo contenga los especificadores de formato x, o y s.

8.- Guía de GHex editor hexadecimal de GNOME: editar un archivo
ghex-15
Para editar un archivo, ejecute los siguientes pasos:
  1. Pulse en la vista hexadecimal o ASCII del archivo. La vista en la que el cursor está activo muestra un cursor completo. La vista en la que el cursor no está activo muestra el contorno del cursor.
  2. Use cualquiera de los siguientes métodos para mover el cursor por el archivo:
9.- Colección de iconos para Tux, el simpático pinguino de Linux.
Tuxguitar
10.- 4Pane navegador de archivos para Linux con cuatro paneles

4Pane-1 4Pane es un explorador de carpetas con el que no perdernos entre la enorme cantidad de ficheros del directorio raíz. Su interfaz se divide en cuatro partes, para facilitar la navegación y poder mover ficheros de una carpeta a otra rápidamente, recordando al mítico Midnight Commander pero en versión gráfica.
A sus funciones como gestor de archivos incorpora otras, como enlaces a Firefox, Openoffice y el editor de texto, montaje de discos, particiones e ISOs, extracción de archivos comprimidos e incluso una lista de las carpetas que más solemos abrir y acceso al terminal.
Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guía PHP: como crear una calculadora básica.

PHP es un lenguaje de programación de uso general de código del lado del servidor originalmente diseñado para el desarrollo web de contenido dinámico.

Fue uno de los primeros lenguajes de programación del lado del servidor que se podían incorporar directamente en el documento HTML en lugar de llamar a un archivo externo que procese los datos.

El código es interpretado por un servidor web con un módulo de procesador de PHP que genera la página Web resultante. PHP ha evolucionado por lo que ahora incluye también una interfaz de línea de comandos que puede ser usada en aplicaciones gráficas independientes.

PHP-logo

PHP puede ser usado en la mayoría de los servidores web al igual que en casi todos los sistemas operativos y plataformas sin ningún costo.

PHP fue creado originalmente por Rasmus Lerdorf en 1995. Actualmente el lenguaje sigue siendo desarrollado con nuevas funciones por el grupo PHP.2 Este lenguaje forma parte del software libre publicado bajo la licencia PHP que es incompatible con la Licencia Pública General de GNU debido a las restricciones del uso del término PHP.

fonte: Wikipedia

Ultima versión estable publicada:

PHP 5.4.19 and PHP 5.5.3 Released!

Calculadora básica.

PHP entre otras cosas nos permite realizar múltiples cálculos matemáticos. En este caso vamos a crear una calculadora elemental, tan elemental que solamente nos sumara tres valores, pero nos servirá para entender como opera con las variables PHP.

Es importante destacar que PHP contempla de manera diferente las variables tipo cadena (por ejemplo un nombre), y las de tipo numérico.

Una variable de cadena se define como $nombre = “Juan”;
Una variable numérica se define como $valor = 7;

Es decir, las variables numéricas no va el valor entre comillas. Con esto, los operadores son los ya conocidos en otros lenguajes:

+ para sumar
- para restar
* para multiplicar
/ para dividir

El código seria el siguiente:

<html> 
<head> 
<title>Formulario.</title> 
</head> 
<body> 
<form method="POST" action="sumar.php">
    <p>Valor 1: <input type="text" name="T1" size="20"></p>
    <p>Valor 2: <input type="text" name="T2" size="20"></p>
    <p>Valor 3: <input type="text" name="T3" size="20"></p>
    <p><input type="submit" value="Sumar" name="B1"></p>
</form>
</body>
</html>
===============================
<html> 
<head> 
<title>Sumar.</title> 
</head> 
<body> 
<?php
$valor1 = $_POST['T1'];
$valor2 = $_POST['T2'];
$valor3 = $_POST['T3'];
$suma = $valor1 + $valor2 + $valor3;
echo "$valor1 + $valor2 + $valor3 = $suma";
?>
</body>
</html>

php calculadora

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: alta, listado, consulta y borrado de datos (2a parte).

Python es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).
python listasModificación de datos (App Engine).
Trabajaremos nuevamente con el problema de usuarios. Dispondremos un formulario que solicite la carga del nombre de un usuario y pasaremos a un segundo formulario donde mostraremos los datos actuales de dicho usuario. En una tercer página procedemos a modificar los datos ingresados.
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import db

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="formulario2" method="post">
Ingrese nombre de usuario a modificar:
<input type="text" name="nombre"><br>
<input type="submit" value="Buscar"><br>
</form>
</body>
</html>
""")

class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()

class Formulario2(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario2" method="post">
Nombre actual:
""")
      self.response.out.write("<input type=\"text\" name=\"nombre\" value=\""+usu[0].nombre+"\"><br>")
      self.response.out.write("Clave actual:")
      self.response.out.write("<input type=\"text\" name=\"clave\" value=\""+usu[0].clave+"\"><br>")
      self.response.out.write("<input type=\"hidden\" name=\"nombreoculto\" value=\""+usu[0].nombre+"\">")
      self.response.out.write("""
<input type="submit" value="Modificar"><br>
</form>
</body>
</html>
""")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("</body></body>")
   

class ProcFormulario2(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nomoculto=cgi.escape(self.request.get('nombreoculto'))
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))   
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nomoculto)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].nombre=nom
      usu[0].clave=cla
      usu[0].put()
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("<a href=\"\\\">Principal</a>")     
    self.response.out.write("</body></body>")
   
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/formulario2', Formulario2),
                                        ('/procformulario2', ProcFormulario2),                                       
                                       ],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
El segundo formulario debemos inicializar los atributos value de los dos controles text para que aparezcan cargados inicialmente con los datos actuales.
Por otro lado también es necesario definir un campo oculto donde almacenar el nombre de usuario actual, ya que si lo modifica no sabremos cual buscar:
class Formulario2(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario2" method="post">
Nombre actual:
""")
      self.response.out.write("<input type=\"text\" name=\"nombre\" value=\""+usu[0].nombre+"\"><br>")
      self.response.out.write("Clave actual:")
      self.response.out.write("<input type=\"text\" name=\"clave\" value=\""+usu[0].clave+"\"><br>")
      self.response.out.write("<input type=\"hidden\" name=\"nombreoculto\" value=\""+usu[0].nombre+"\">")
      self.response.out.write("""
<input type="submit" value="Modificar"><br>
</form>
</body>
</html>
""")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("</body></body>")
La tercer página recupera el usuario que ingresó en el primer formulario, pero rescatado del campo oculto. Procedemos seguidamente a modificar los datos rescatados de la tabla y confirmamos los nuevos datos llamando al método put:
class ProcFormulario2(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nomoculto=cgi.escape(self.request.get('nombreoculto'))
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))   
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nomoculto)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].nombre=nom
      usu[0].clave=cla
      usu[0].put()
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("<a href=\"\\\">Principal</a>")     
    self.response.out.write("</body></body>")
Listado, Alta, Baja y Modificación (App Engine).
Ahora plantearemos todos los conceptos vistos para el manejo de una tabla de datos utilizando el Google App Engine.
Mostraremos un listado con una tabla con todos los nombres de usuarios y claves, dos hipervínculos uno para poder borrar el usuario y otro para poder modificar el registro. Por último dispondremos un hipervínculo para llamar a un formulario de alta de usuario.
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import db

class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()

class Listado(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    self.response.out.write("<table border=\"1\">")
    self.response.out.write("<tr>")
   

self.response.out.write("<td>Usuario</td><td>Clave</td><td>Borrar</td><td>Modificar&l

t;/td>") 
    self.response.out.write("</tr>")
    usuarios=db.GqlQuery("select * from TablaUsuarios")
    for usu in usuarios:
      self.response.out.write("<tr>")
      self.response.out.write("<td>" + usu.nombre +"</td>")
      self.response.out.write("<td>" + usu.clave +"</td>")
      self.response.out.write("<td><a href=\"baja?nombre="+usu.nombre+"\">Borra?</a>"+"</td>")
      self.response.out.write("<td><a

href=\"formulariomodificacion?nombre="+usu.nombre+"\">Modifica?</a>"+"</td>")
      self.response.out.write("</tr>")
    self.response.out.write("<tr>")
    self.response.out.write("<td colspan=\"4\"><a href=\"formularioalta\">Alta</a></td>") 
    self.response.out.write("</tr>")  
    self.response.out.write("</table>")  
    self.response.out.write("</body></html>")

class FormularioAlta(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="alta" method="post">
Ingrese su nombre:
<input type="text" name="nombre"><br>
Ingrese su clave:
<input type="password" name="clave"><br>
<input type="submit" value="Alta"><br>
</form>
</body>
</html>
""")

class Alta(webapp.RequestHandler):
  def post(self):
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))
    usuario=TablaUsuarios()
    usuario.nombre=nom
    usuario.clave=cla
    usuario.put()
    self.redirect("/")

class Baja(webapp.RequestHandler):
  def get(self):
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].delete()
    self.redirect("/")
   
class FormularioModificacion(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      self.response.out.write("""
<html>
<head></head>
<body>
<form action="modificacion" method="post">
Nombre actual:
""")
      self.response.out.write("<input type=\"text\" name=\"nombre\" value=\""+usu[0].nombre+"\"><br>")
      self.response.out.write("Clave actual:")
      self.response.out.write("<input type=\"text\" name=\"clave\" value=\""+usu[0].clave+"\"><br>")
      self.response.out.write("<input type=\"hidden\" name=\"nombreoculto\" value=\""+usu[0].nombre+"\">")
      self.response.out.write("""
<input type="submit" value="Modificar"><br>
</form>
</body>
</html>
""")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("</body></body>")
   
class Modificacion(webapp.RequestHandler):
  def post(self):
    nomoculto=cgi.escape(self.request.get('nombreoculto'))
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))   
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nomoculto)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].nombre=nom
      usu[0].clave=cla
      usu[0].put()
    self.redirect("/")

     
def main():
  application = webapp.WSGIApplication([('/', Listado),
                                        ('/formularioalta',FormularioAlta ),
                                        ('/alta',Alta ),                                       
                                        ('/baja', Baja),
                                        ('/formulariomodificacion', FormularioModificacion),
                                        ('/modificacion', Modificacion),                                       
                                       ],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
En la función main() debemos inicializar la lista que vincula las URL de las páginas y las clases que se ejecutan:
def main():
  application = webapp.WSGIApplication([('/', Listado),
                                        ('/formularioalta',FormularioAlta ),
                                        ('/alta',Alta ),                                       
                                        ('/baja', Baja),
                                        ('/formulariomodificacion', FormularioModificacion),
                                        ('/modificacion', Modificacion),                                       
                                       ],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)
La clase Listado es la que muestra la raiz del sitio y tiene por objetivo crear una tabla HTML con todos los usuarios almacenados en la TablaUsuarios. Además de imprimir cada registro disponemos un hipervínculo pasando como parámetro el nombre de usuario a borrar o modificar:
class Listado(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    self.response.out.write("<table border=\"1\">")
    self.response.out.write("<tr>")
   

self.response.out.write("<td>Usuario</td><td>Clave</td><td>Borrar</td><td>Modificar&l

t;/td>") 
    self.response.out.write("</tr>")
    usuarios=db.GqlQuery("select * from TablaUsuarios")
    for usu in usuarios:
      self.response.out.write("<tr>")
      self.response.out.write("<td>" + usu.nombre +"</td>")
      self.response.out.write("<td>" + usu.clave +"</td>")
      self.response.out.write("<td><a href=\"baja?nombre="+usu.nombre+"\">Borra?</a>"+"</td>")
      self.response.out.write("<td><a

href=\"formulariomodificacion?nombre="+usu.nombre+"\">Modifica?</a>"+"</td>")
      self.response.out.write("</tr>")
    self.response.out.write("<tr>")
    self.response.out.write("<td colspan=\"4\"><a href=\"formularioalta\">Alta</a></td>") 
    self.response.out.write("</tr>")  
    self.response.out.write("</table>")  
    self.response.out.write("</body></html>")
La clase FormularioAlta muestra los dos controles text y el botón submit, cuando se presiona dicho botón se procede a llamar a la URL alta:
class FormularioAlta(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="alta" method="post">
Ingrese su nombre:
<input type="text" name="nombre"><br>
Ingrese su clave:
<input type="password" name="clave"><br>
<input type="submit" value="Alta"><br>
</form>
</body>
</html>
""")
La clase Alta inicializa un objeto de la clase TablaUsuarios, procede a registrar los datos y mediante el método redirect redirige a la raiz del sitio (es decir la clase Listado):
class Alta(webapp.RequestHandler):
  def post(self):
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))
    usuario=TablaUsuarios()
    usuario.nombre=nom
    usuario.clave=cla
    usuario.put()
    self.redirect("/")
Cuando se presiona el hipervínculo "Borra?" en el listado se ejecuta la clase Baja y recibe como parámetro en el hipervínculo el nombre de usuario a borrar. Recuperamos el registro, llamamos al método delete y redirigimos nuevamente a la página de listado:
class Baja(webapp.RequestHandler):
  def get(self):
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].delete()
    self.redirect("/")
Cuando se presiona el hipervínculo "Modificación?" se ejecuta la clase FormularioModificacion, en este recuperamos el nombre de usuario e inicializamos los controles text y el campo oculto:
class FormularioModificacion(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      self.response.out.write("""
<html>
<head></head>
<body>
<form action="modificacion" method="post">
Nombre actual:
""")
      self.response.out.write("<input type=\"text\" name=\"nombre\" value=\""+usu[0].nombre+"\"><br>")
      self.response.out.write("Clave actual:")
      self.response.out.write("<input type=\"text\" name=\"clave\" value=\""+usu[0].clave+"\"><br>")
      self.response.out.write("<input type=\"hidden\" name=\"nombreoculto\" value=\""+usu[0].nombre+"\">")
      self.response.out.write("""
<input type="submit" value="Modificar"><br>
</form>
</body>
</html>
""")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("</body></body>")
Cuando se presiona el botón modificación del formulario anterior se ejecuta la clase Modificacion donde se procede a modificar el nombre y clave del usuario. Por último se redirige a la raiz del sitio:
class Modificacion(webapp.RequestHandler):
  def post(self):
    nomoculto=cgi.escape(self.request.get('nombreoculto'))
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))   
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nomoculto)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].nombre=nom
      usu[0].clave=cla
      usu[0].put()
    self.redirect("/")
Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: alta, listado, consulta y borrado de datos (1a parte).

Python es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).
python Atributos de una clase
Alta y listado de una base de datos (App Engine)
El almacenamiento de datos utilizando la infraestructura de Google es bastante distinta a las metodologías de MySql, Oracle, Sql Server etc.
Google utiliza una tecnología llamada 'Bigtable', básicamente es un sistema de almacenamiento distribuido que permite escalar de forma muy sencilla, evitando que por ejemplo las consultas de tablas con millones de registros se resientan.

Para hacer uso de esta tecnología debemos importar el paquete db:

from google.appengine.ext import db
 
Desarrollaremos una aplicación que permita almacenar el nombre de usuario y su clave. Luego imprimiremos todos los registros almacenados.
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import db

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese su nombre:
<input type="text" name="nombre"><br>
Ingrese su clave:
<input type="password" name="clave"><br>
<input type="submit" value="enviar"><br>
</form>
</body>
</html>
""")


class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))
    usuario=TablaUsuarios()
    usuario.nombre=nom
    usuario.clave=cla
    usuario.put()
    self.response.out.write("<a href=\"listadousuarios\">Listado</a>")
    self.response.out.write("</body></body>")
   
class ListadoUsuarios(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    usuarios=db.GqlQuery("select * from TablaUsuarios")
    for usu in usuarios:
      self.response.out.write("Nombre:" + usu.nombre +"<br>")
      self.response.out.write("Clave:" + usu.clave +"<br>")
      self.response.out.write("<hr>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")

  
   
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1),
                                        ('/listadousuarios', ListadoUsuarios)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
Veamos todo lo que debemos agregar:

Debemos importar el paquete db:

from google.appengine.ext import db 

Debemos declarar una clase que representa una tabla.

Esta clase debe heredar de la clase Model contenida en el paquete db.

Definimos dos atributos de tipo StringProperty.

StringProperty es una clase contenida en el paquete db y que encapsula el manejo de un campo de cadena de caracteres:

class TablaUsuarios(db.Model): nombre=db.StringProperty() clave=db.StringProperty()

Para efectuar el alta de un registro en la tabla:

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))
    usuario=TablaUsuarios()
    usuario.nombre=nom
    usuario.clave=cla
    usuario.put()
    self.response.out.write("<a href=\"listadousuarios\">Listado</a>")
    self.response.out.write("</body></body>")

Creamos un objeto de la clase Tablausuarios:


usuario=TablaUsuarios()

Inicializamos los atributos nombre y clave con los datos extraidos del formulario.

usuario.nombre=nom
    usuario.clave=cla


Llamamos al método put que confirma los datos previamente cargados:

usuario.put() 

Para obtener un listado de todos los registros almacenados:

class ListadoUsuarios(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    usuarios=db.GqlQuery("select * from TablaUsuarios")
    for usu in usuarios:
      self.response.out.write("Nombre:" + usu.nombre +"<br>")
      self.response.out.write("Clave:" + usu.clave +"<br>")
      self.response.out.write("<hr>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")



Creamos un objeto de la clase GqlQuery pasando como parámetro al constructor los datos a recuperar:


usuarios=db.GqlQuery("select * from TablaUsuarios")


Mediante un for recorremos la lista de usuarios y los imprimimos:


for usu in usuarios:
      self.response.out.write("Nombre:" + usu.nombre +"<br>")
      self.response.out.write("Clave:" + usu.clave +"<br>")
      self.response.out.write("<hr>")

Como esta aplicación requiere tres páginas luego debemos registrarlas cuando creamos un objeto de la clase WSGIApplication:
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1),
                                        ('/listadousuarios', ListadoUsuarios)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

Consulta de datos (App Engine).

Confeccionaremos una aplicación que nos permita ingresar el nombre de usuario y nos recupere y muestre su clave. Tener en cuenta los datos cargados en el concepto anterior:
import cgi
import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext import db
class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese nombre de usuario:
<input type="text" name="nombre"><br>
<input type="submit" value="enviar"><br>
</form>
</body>
</html>
""")
class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()
class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      self.response.out.write("Clave:" + usu[0].clave +"<br>")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")   
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1),
                                       ],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
  main()

Creamos un formulario para ingresar el nombre de usuario a buscar:


class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese nombre de usuario:
<input type="text" name="nombre"><br>
<input type="submit" value="enviar"><br>
</form>
</body>
</html>
""")


El botón submit hace que se ejecute la clase ProcFormulario1:

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      self.response.out.write("Clave:" + usu[0].clave +"<br>")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")




Primero generamos una consulta a la tabla y le pasamos como parámetro en el campo nombre el valor rescatado del formulario, debemos utilizar los dos puntos y un uno para indicar que dicho espacio será remplazado por el segundo parámetro:

usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)


La clase GqlQuery tiene un método llamado fetch que retorna todos los registros generados en la consulta. Al método fetch le pasamos la cantidad de registros que queremos rescatar y por último accedemos a la primer componente de la lista siempre y cuando la cantidad de elementos sea mayor a cero.


Borrado de datos (App Engine).


Confeccionaremos una aplicación que nos permita ingresar el nombre de usuario y efectúe su borrado.. Tener en cuenta los datos cargados en conceptos anterioriores.


import cgi
import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext import db

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese nombre de usuario a borrar:
<input type="text" name="nombre"><br>
<input type="submit" value="enviar"><br>
</form>
</body>
</html>
""")
class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()
class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].delete()
      self.response.out.write("Se borro el usuario<br>")
    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")

def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1),
                                       ],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
  main()



Si lo comparamos con la consulta es prácticamente igual con la salvedad donde en lugar de mostrarlo procedemos a borrarlo:


nom=cgi.escape(self.request.get('nombre'))
    usuario=db.GqlQuery("select * from TablaUsuarios where nombre=:1",nom)
    usu=usuario.fetch(1)
    if len(usu)>0:
      usu[0].delete()
      self.response.out.write("Se borro el usuario<br>")

    else:
      self.response.out.write("No existe un usuario con dicho nombre<br>")

El método delete borrar el registro.


Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: Formularios HTML.

Python es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).

Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).
python Funciones con parámetros por defecto1
Formulario HTML - control radio (App Engine).
Realizaremos una aplicación que muestre un formulario con dos controles de tipo text, luego dos controles de tipo radio que indiquen si queremos sumar o restar los valores ingresados en los controles text.
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<input type="radio" name="radio1" value="suma">sumar
<br>
<input type="radio" name="radio1" value="resta">restar
<br>
<input type="submit" value="operar">
</form>
</body>
</html>
""")


class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    v1=int(self.request.get('valor1'))
    v2=int(self.request.get('valor2'))
    operacion=self.request.get('radio1')
    if operacion=="suma":
      resultado=v1+v2
    else:
      resultado=v1-v2
    self.response.out.write("El resultado de la " + operacion + " es " + str(resultado))
    self.response.out.write("</body></body>")
   
   
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
En la página principal del sitio asociamos la clase que despliega el formulario HTML:
('/', Formulario1)
Luego la clase que procesa los datos ingresados en el formulario es ProcFormulario1, en esta primero rescatamos los dos valores ingresados en los controles text y procedemos a convertilos a entero:
v1=int(self.request.get('valor1'))
    v2=int(self.request.get('valor2'))
Rescatamos la propiedad value del control radio seleccionado:
operacion=self.request.get('radio1')
Y mediante un if verificamos si tenemos que sumar o restar los contenidos de los text:
if operacion=="suma":
      resultado=v1+v2
    else:
      resultado=v1-v2
Por último procedemos a imprimir el resultado de la operación:
self.response.out.write("El resultado de la " + operacion + " es " + str(resultado))
Formulario HTML - control select (App Engine).
Veamos el control HTML de tipo select. Este tipo de control el funcionamiento es similar al de un conjunto de controles de tipo radio.
Confeccionaremos el mismo problemas del concepto anterior es decir cargar dos números y posteriormente mediante un control de tipo select seleccionar si queremos sumarlos o restarlos (solo una de estas operaciones se puede elegir)
La sintaxis del control de tipo select es:
<select name="operacion">
<option value="suma">Sumar</option>
<option value="resta">Restar</option>
</select>
Es importante notar que la sintaxis es bastante distinta a los controles de tipo text y radio.
El elemento select tiene definido la propiedad name mediante la cual rescataremos el valor seleccionado en el servidor.
El elemento select contiene un conjunto de elementos option. Cada elemento option tiene definido la propiedad value. El que quede seleccionado el control select rescata su propiedad value.
Luego el programa en Python utilizando Google App Engine:
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<select name="operacion">
<option value="suma">Sumar</option>
<option value="resta">Restar</option>
</select>
<br>
<input type="submit" value="operar">
</form>
</body>
</html>
""")

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    v1=int(self.request.get('valor1'))
    v2=int(self.request.get('valor2'))
    op=self.request.get('operacion')
    if op=="suma":
      resultado=v1+v2
    else:
      resultado=v1-v2
    self.response.out.write("El resultado de la " + op + " es " + str(resultado))
    self.response.out.write("</body></body>")
   

   
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
De forma similar como venimos trabajando en una clase desplegamos el formulario HTML (Formulario1) y otra clase procesa el contenido del formulario (ProcFormulario1).
En la página que procesamos los datos del formulario rescatamos los valores de los controles text y los convertimos a entero:
v1=int(self.request.get('valor1'))
    v2=int(self.request.get('valor2'))
Seguidamente rescatamos la propiedad name de la opción seleccionada del control select:
op=self.request.get('operacion')
Mediante un if verificamos si tenemos que sumar o restar
if op=="suma":
      resultado=v1+v2
    else:
      resultado=v1-v2
Por último mostramos el resultado:
self.response.out.write("El resultado de la " + op + " es " + str(resultado))

Formulario HTML - control select con selección múltiple (App Engine).
Veamos una variante del control select la cual permite seleccionar varias opciones de su contenido. Para esto debemos agregar la propiedad multiple cuando lo definimos:
<select name="operacion" multiple>
Con este simple cambio podemos seleccionar más de un elemento del interior del control select.
Confeccionaremos el mismo problema anterior, solo que ahora podremos seleccionar las dos operaciones en forma simultanea:
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<select name="operacion" multiple>
<option value="suma">Sumar</option>
<option value="resta">Restar</option>
</select>
<br>
<input type="submit" value="operar">
</form>
</body>
</html>
""")


class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    v1=int(self.request.get('valor1'))
    v2=int(self.request.get('valor2'))
    operaciones=self.request.get_all('operacion')
    for op in operaciones:
      if op=="suma":
        resultado=v1+v2
        self.response.out.write("El resultado de la " + op + " es " + str(resultado) + "<br>")   
      if op=="resta":
        resultado=v1-v2
        self.response.out.write("El resultado de la " + op + " es " + str(resultado) + "<br>")
    self.response.out.write("</body></body>")
   
   
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
Para recuperar la lista de valores seleccionados del control select debemos llamar al método get_all del objeto request en lugar de get:
operaciones=self.request.get_all('operacion')
Luego mediante una estructura repetitiva recorremos la lista de valores devuelto y comparamos con los valores posibles:
for op in operaciones:
      if op=="suma":
        resultado=v1+v2
        self.response.out.write("El resultado de la " + op + " es " + str(resultado) + "<br>")   
      if op=="resta":
        resultado=v1-v2
        self.response.out.write("El resultado de la " + op + " es " + str(resultado) + "<br>")

Formulario HTML - control checkbox (App Engine).
Otra forma de hacer selecciones múltiples es utilizar un conjunto de controles de tipo checkbox. Cada control de tipo checkbox es independiente.
Resolvamos el problema del concepto anterior empleando dos controles de tipo checkbox:
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<input type="checkbox" name="check1" value="suma">sumar
<br>
<input type="checkbox" name="check2" value="resta">restar
<br>
<input type="submit" value="operar">
</form>
</body>
</html>
""")


class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    v1=int(self.request.get('valor1'))
    v2=int(self.request.get('valor2'))
    su=self.request.get('check1')
    if su=="suma":
       resultado=v1+v2
       self.response.out.write("El resultado de la " + su + " es " + str(resultado) + "<br>")   
    re=self.request.get('check2')
    if re=="resta":
       resultado=v1-v2
       self.response.out.write("El resultado de la " + re + " es " + str(resultado) + "<br>")   
    self.response.out.write("</body></body>")

     
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
Cada checkbox lo recuperamos en forma independiente:
su=self.request.get('check1')
    if su=="suma":
       resultado=v1+v2
       self.response.out.write("El resultado de la " + su + " es " + str(resultado) + "<br>")   
Si se encuentra seleccionado el método get retorna el valor de la propiedad value del control HTML, en caso de no estar seleccionado retorna un string vacío.

Alta y listado de una base de datos (App Engine).
El almacenamiento de datos utilizando la infraestructura de Google es bastante distinta a las metodologías de MySql, Oracle, Sql Server etc.
Google utiliza una tecnología llamada 'Bigtable', básicamente es un sistema de almacenamiento distribuido que permite escalar de forma muy sencilla, evitando que por ejemplo las consultas de tablas con millones de registros se resientan.
Para hacer uso de esta tecnología debemos importar el paquete db:
from google.appengine.ext import db
Desarrollaremos una aplicación que permita almacenar el nombre de usuario y su clave. Luego imprimiremos todos los registros almacenados.
import cgi
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import db

class Formulario1(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
<html>
<head></head>
<body>
<form action="procformulario1" method="post">
Ingrese su nombre:
<input type="text" name="nombre"><br>
Ingrese su clave:
<input type="password" name="clave"><br>
<input type="submit" value="enviar"><br>
</form>
</body>
</html>
""")

class TablaUsuarios(db.Model):
  nombre=db.StringProperty()
  clave=db.StringProperty()

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))
    usuario=TablaUsuarios()
    usuario.nombre=nom
    usuario.clave=cla
    usuario.put()
    self.response.out.write("<a href=\"listadousuarios\">Listado</a>")
    self.response.out.write("</body></body>")
   
class ListadoUsuarios(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    usuarios=db.GqlQuery("select * from TablaUsuarios")
    for usu in usuarios:
      self.response.out.write("Nombre:" + usu.nombre +"<br>")
      self.response.out.write("Clave:" + usu.clave +"<br>")
      self.response.out.write("<hr>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")
    
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1),
                                        ('/listadousuarios', ListadoUsuarios)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
Veamos todo lo que debemos agregar:
  • Debemos importar el paquete db:
    from google.appengine.ext import db
    Debemos declarar una clase que representa una tabla. Esta clase debe heredar de la clase Model contenida en el paquete db. Definimos dos atributos de tipo StringProperty. StringProperty es una clase contenida en el paquete db y que encapsula el manejo de un campo de cadena de caracteres:
  • class TablaUsuarios(db.Model): nombre=db.StringProperty() clave=db.StringProperty()
  • Para efectuar el alta de un registro en la tabla:


class ProcFormulario1(webapp.RequestHandler):
  def post(self):
    self.response.out.write("<html><head></head><body>")
    nom=cgi.escape(self.request.get('nombre'))
    cla=cgi.escape(self.request.get('clave'))
    usuario=TablaUsuarios()
    usuario.nombre=nom
    usuario.clave=cla
    usuario.put()
    self.response.out.write("<a href=\"listadousuarios\">Listado</a>")
    self.response.out.write("</body></body>")


Creamos un objeto de la clase Tablausuarios:


usuario=TablaUsuarios()


Inicializamos los atributos nombre y clave con los datos extraidos del formulario.


usuario.nombre=nom
    usuario.clave=cla




Llamamos al método put que confirma los datos previamente cargados:


usuario.put()
  • Para obtener un listado de todos los registros almacenados:
class ListadoUsuarios(webapp.RequestHandler):
  def get(self):
    self.response.out.write("<html><head></head><body>")
    usuarios=db.GqlQuery("select * from TablaUsuarios")
    for usu in usuarios:
      self.response.out.write("Nombre:" + usu.nombre +"<br>")
      self.response.out.write("Clave:" + usu.clave +"<br>")
      self.response.out.write("<hr>")
    self.response.out.write("<a href=\"\\\">Principal</a>")
    self.response.out.write("</body></body>")

Creamos un objeto de la clase GqlQuery pasando como parámetro al constructor los datos a recuperar:

usuarios=db.GqlQuery("select * from TablaUsuarios")

Mediante un for recorremos la lista de usuarios y los imprimimos:


for usu in usuarios:
      self.response.out.write("Nombre:" + usu.nombre +"<br>")
      self.response.out.write("Clave:" + usu.clave +"<br>")
      self.response.out.write("<hr>")


Como esta aplicación requiere tres páginas luego debemos registrarlas cuando creamos un objeto de la clase WSGIApplication:


def main():
  application = webapp.WSGIApplication([('/', Formulario1),
                                        ('/procformulario1', ProcFormulario1),
                                        ('/listadousuarios', ListadoUsuarios)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)




Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog: