Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al...

32
Tecnologías de Servidor: Tecnologías de Servidor: PHP, CGI, programación PHP, CGI, programación Web con python Web con python Web con python Web con python Pedro J. Muñoz Merino Pedro J. Muñoz Merino http://www.it.uc3m.es/pedmume/ http://www.it.uc3m.es/pedmume/

Transcript of Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al...

Page 1: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Tecnologías de Servidor: Tecnologías de Servidor: PHP, CGI, programación PHP, CGI, programación

Web con pythonWeb con pythonWeb con pythonWeb con python

Pedro J. Muñoz MerinoPedro J. Muñoz Merinohttp://www.it.uc3m.es/pedmume/http://www.it.uc3m.es/pedmume/

Page 2: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Tecnologías de Servidor

● Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación diferentes de Java. Además del cambio de lenguaje de programación, usualmente hay que hacer una serie de cosas comunes para los que cambia la sintaxis y modo de conseguirlo:

― Tratamiento de peticiones de entrada

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas2

Tratamiento de peticiones de entrada

― Obtener información de la petición HTTP (cabecera+formularios)

― Responder con información al cliente (ejemplo HTML)

― Mantener la sesión, manejo de cookies, etc.

― Tratamiento de múltiples peticiones a la vez

― Tratamiento de errores

― Conexión con Bases de Datos

― Acceso y manipulación de ficheros XML

Page 3: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Variables

● Declaración de variables

― $nombre_variable = valor

● Ejemplos

― $a = 7

― $direccion = “calle de Arriba”

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas3

● No hay que declarar explícitamente el tipo que son, sino que en PHP se interpreta automáticamente según su declaración

● Para obtener el valor de una variable

― $nombre_variable

Page 4: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Operaciones con Strings

● Para concatenar dos strings se usa el “.” entre ellos

― String1 . String2

● Ejemplo

$s1 = “El valor es”;

$s2 = “rojo”;

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas4

$s2 = “rojo”;

echo $s1 . “ “ . $s2;

● Hay muchas funciones para realizar operaciones con strings, algunas de ellas son parecidas a algunos interpretes de comandos (shells). Ejemplos: strcmp, strncmp, strlen, strpos, bin2hex, strchr, strtolower, strtoupper

Page 5: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Arrays

● Un array permite asociar valores a índices. Los índices pueden ser numéricos o strings

$var1=array(valor1, valor2, valor3, …, valorn);

$var2=array(clave1=>valor1, clave2=>valor2, …, claven=>valorn);

$var3[0]=valor1;

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas5

$var4[clave1]=varlor1;

● Para acceder a los valores

$nombre_variable[indice]

Page 6: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Funciones

● La manera genérica de definir una función en PHP

function nombre_funcion ($var1, $var2, …, $varn) {

código de la función

}

● La función puede retornar un valor que puede ser una

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas6

La función puede retornar un valor que puede ser una variable, también un array

return $nombre_variable

● A la función se la invoca desde el cuerpo de la siguiente manera

nombre_function(param1, param2, …, paramn)

Page 7: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Operadores

● Aritméticos entre números enteros:

+ - * / %

● Comparación:

< > == != <= >=

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas7

< > == != <= >=

● Lógicos:

&& || !

Page 8: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Estructuras de Control

● if

● while

● for

● switch

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas8

Page 9: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: if

● Estructura general

if (condicion) {

código

}

elseif (condicion) {

● Ejemplo

if ($a>$b)

echo “Es mayor”;

elseif ($a==$b)

echo “Es igual”;

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas9

elseif (condicion) {

código

}

else{

código}

echo “Es igual”;

else

echo “Es menor”;

Page 10: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: while

● Estructura general

while (condicion)

{

código

}

● Ejemplo

$i=0;

while ($i<10)

{

echo “i vale” . $i;

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas10

} echo “i vale” . $i;

$i++;

}

Page 11: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: switch

● Estructura general

switch (expresión){case valor1:código;break;

● Ejemplo

switch ($comida){case “patatas”:echo “Son patatas";break;

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas11

break;case valor2:código;break;

… default:código;

}

break;case “pescado:echo “Es pescado";break;

default:echo “No hay comida";

}

Page 12: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: for

● Estructura general

for (expr_inic; condicion; expr_por_cada_iter){código;}

● Ejemplo

for ($i=0; $i<10; $i++) {

echo “i vale” . $i;

}

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas12

}

foreach ($array as $lista){código;}

Page 13: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Tratamiento de peticiones de entrada

● En un servidor PHP tendremos varios scripts PHP, que son páginas PHP, implementadas en este lenguaje. A esas páginas llegarán peticiones HTTP que pueden ser tanto GET como POST. Podemos retomar los valores de lo que nos llega, gracias a que queda grabado todo lo que nos llega de entrada en 2 variables

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas13

― $_GET: Es un array

― $_SET: Es un array

● Cualquier código de PHP visto y que veamos irá en la forma de etiqueta de la siguiente manera

<?php

código

?>

Page 14: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Acceso a Información de peticiones GET

● Una petición HTTP GET se produce porque el usuario pone la URL directamente, porque presiona un enlace de URL o porque está puesto en un formulario

― Forma de la URL: http://sitio/script.php?param1=valor1&param2=valor2&...paramn=valorn

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas14

● Para acceder al valor de los parámetros de una petición GET

― $_GET[“paramn”]

Page 15: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Acceso a Información de peticiones POST

● Una petición HTTP POST se produce porque está puesto en un formulario

― La URL no tiene incrustados los parámetros sino que estos van en el cuerpo del mensaje

● Para acceder al valor de los parámetros de una petición

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas15

● Para acceder al valor de los parámetros de una petición POST

― $_POST[“paramn”]

Page 16: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Ejemplo de petición POST: Aplicación Calculadora

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Operation Calculator Application</title></head><body><h1> Operation Calculator Application </h1><form action="calculator.php" method=POST>Argument 1:<input type=text size=5 name=arg1>

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas16

<input type=text size=5 name=arg1><br>Argument 2:<input type=text size=5 name=arg2>Operation (enter add, substract, multiplication or division):<input type=text size=5 name=operation><br><input type=submit></form></body></html>

Page 17: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Respuesta con información

● Se pueden escribir respuestas de diferentes maneras

― Intercalando etiquetas HTML en los trozos de código de etiquetas PHP

― Intercalando texto en los trozos de código de etiquetas PHP

― Utilizando las funciones echo o print en trozos de etiquetas PHP

● Los comentarios en PHP se ponen como

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas17

● Los comentarios en PHP se ponen como

― Para una línea: // comentario

― Para varias líneas: /* comentarios */

Page 18: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Sesiones y Cookies

● Creación de una sesión: función session_start();

● Poner valores de parámetros en una sesión y recuperarlos se hace a través de la variable $_SESSION que es un array y se manipula como tal

● Función isset para saber si un determinado parámetro ya ha sido incluido en la sesión o no

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas18

● Eliminar parámetros de una sesión con la función unset()

● Cerrar una sesión con la función session_destroy()

● Reescritura de URL si no se admiten cookies

● Cookies

― Para poner: setcookie(nombre, valor, expira, ruta, dominio);

― Para obtener valor: Con el array $_COOKIE

― Para eliminar: Cambiar fecha en la que expira

Page 19: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: include y forward

● include

― Función include (trae todo lo que haya en el fichero incluido, si hay algún error, sólo muestra un warning):

include(“nombre_fichero.php");

― Función require (trae todo lo que haya en el fichero incluido por el require pero si y sólo si no hay ningún error. En caso de error

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas19

el require pero si y sólo si no hay ningún error. En caso de error detiene la ejecución):

require(“nombre_fichero.php");

● forward

― http://stackoverflow.com/questions/433774/does-php-have-an-equivalent-of-javas-requestdispatcher-forward

Page 20: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

PHP: Acceso a Base de Datos mySQL

● Conectar con la base de datos, devuelve una conexión: mysql_connect(nombre_servidor,usuario,contraseña);

● Seleccionar una base de datos concreta: mysql_select_db(“nombre_BD", $conexion);

● Ejecución de sentencias SQL, da un resultado:

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas20

mysql_query(sentencia_SQL);

● Obtener valores tras una sentencia SELECT, obtiene las diferentes filas por cada llamada realizada:

$variable_fila = mysql_fetch_array($result))

● Cerrar la conexión con la base de datos, sobre una conexión: mysql_close($conexion);

Page 21: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Ejemplo: PHP con conexión a Base de Datos (I)<?php

$URL =“localhost";$DB_LOGIN = "root";$DB_PASSWD = "admin2009";

$con = mysql_connect($URL,$DB_LOGIN,$DB_PASSWD);if (!$con)

{die(‘Error en la conexión: ' . mysql_error());}

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas21

}mysql_select_db(“sporting_manager", $con);$type=$_POST["type“];$text=$_POST["text1“];$order=$_POST[“order”];if (strcmp($type, “all_activities”) {$rs = mysql_query("SELECT * FROM ACTIVITIES");} else{$rs= mysql_query("SELECT * FROM PAVILLIONS");}

Page 22: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Ejemplo: PHP con conexión a Base de Datos (II)

If (strcmp($type, “all_activities”) {Código a rellenar} else{$rs= mysql_query("SELECT * FROM PAVILLIONS");} ?><h1>List of all pavillions</h1><table><tr><b><td>PAVILLION</td><td>LOCATION</td></b></tr><p>

<?php

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas22

while($row = mysql_fetch_array($rs)){echo "<tr><td>“;echo $row[‘pavillion'] ; echo "</td> <td>";echo $row[‘location'];echo “</td></tr>”;}

echo “</table>”;mysql_close($con);?>

Page 23: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

CGI: Common Gateway Interface

● Está basado en el lenguaje de programación Perl

● Queda como ejercicio ver como cada una de las cosas posibles vistas en J2EE y PHP, se pueden realizar en CGI

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas23

Page 24: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Programación Web en python con XTutor

● XTutor es una herramienta desarrollada en el MIT (Massachusetts Institute of Technology)

― Servidor Web que se programa en Python

― API en python para programación Web

― Utiliza una base de datos

Tiene una serie de ficheros XML que se denominan XDOCs,

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas24

― Tiene una serie de ficheros XML que se denominan XDOCs, accesibles a través de URLs

― En la base de datos se guarda información sobre usuarios, documentos, estado de documento por usuario, interacciones e ítem de interacción

Page 25: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

XTutor: Forma de procesado de peticiones

● Forma de procesar petición GET o POST

― Se parsea el archivo seleccionado formando un árbol del mismo de objeto XMLTag, importando todos los ficheros python que se referencien como espacios de nombres en los XDOCs

― Toda etiqueta XML será procesada según algún archivo python(.py) de los que están en el espacio de nombres del XDOC

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas25

― Si el atributo save_state está en el atributo raíz del XDOC, entonces se pide autenticación (por contraseña o certificado)

― Se construye una variable answers_dict que contiene todos los parámetros que vienen de una petición POST o GET

― Se llama al método handle_request (answer_dict) del nodo raíz. Desde este método se puede ir llamando a sus homónimos de nodos XML, ejecutando lo que sea conveniente para cada nodo del XML

Page 26: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

XTutor: Forma de procesado de peticiones (continuación)

― Entre la artillería que se dispone para ejecutar asociada a cada nodo, está cualquier estructura permitida en el lenguaje de programación python, recuperar el valor de los argumentos que vienen en answers_dict, coger valores de atributos de dicha etiqueta, utilizar cualquier utilidad del API que proporciona XTutor o generar código HTML

― En caso de que save_state esté activado, se puede ir

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas26

En caso de que save_state esté activado, se puede ir almacenando la información que queramos en el estado, de forma que ese usuario conservará dicha información durante diferentes accesos a dicho XDOC

― Finalmente la respuesta con el HTML generado (será la suma de todas las respuestas de los nodos por los que se va pasando) se le presenta al usuario

Page 27: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

XTutor: Comparación con J2EEAspecto a comparar J2EE XTutor

Lenguaje de programación empleado

Cualquier cosa permitida en Java

Cualquier cosa permitida en Python

Procesado dinámico se produce tras la petición

de…

Servlets, JSPs, EJBs XDOCS (son archivos XML)

Forma de procesamiento A través de los métodos doGet, doPost, doService,

etc.

Desde el método handle_requestdel nodo raíz del XML y por los

otros métodos handle_request de otros nodos XML que se vayan

llamando recursivamenteParámetros de la petición En el objeto request En answer_dict

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas27

Parámetros de la petición En el objeto request En answer_dictManipulación de ficheros XML (obtener atributos, realizar búsquedas de

etiquetas, etc.)

API JDOM. Permite gran potencialidad

API Propietario de XTutor escrito en Python. Permite gran

potencialidad

Base de datos Inicialmente sin tablas definidas

Por defecto con una serie de tablas

Información de Sesión En el objeto session, se mantiene mientras no se

cierre el navegador

Se mantiene en document_state, pero esta información se mantiene

ante diferentes login y no sólo hasta cerrar el navegador

Generación del HTML En JSPs directamente con etiquetas HTML. En servletsa través del objeto response

En XDOCS directamente con etiquetas HTML. En fichero Python

a través de librería especial

Page 28: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

XTutor: Ejemplo Xdoc de la documentación de XTutor

<xdoc:xdocxmlns="http://www.w3.org/1999/xhtml" xmlns:xdoc="py:xdoc_standard_tags" xmlns:demo="py:demo" submit="Checkanswers">

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas28

<p>Here are some problems for you to try:</p>

<demo:question id="q1" answer="46"> 12 + 34 = </demo:question>

<demo:question id="q2" answer="32767"> 2<sup>15</sup> - 1 = </demo:question>

</xdoc:xdoc>

Page 29: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

XTutor: Ejemplo tag handler de la documentación de XTutor

import xdoc,utils,html # useful utilities# <question id="uid" answer="expected"> ... </question>class tag_question(xdoc.XMLTag):

def handle_request(self,answer_dict,**kw): id = self.get_xml_attr('id',default='q')answer = answer_dict.get(id,'‘)expected = utils.ParseNumber(self.get_xml_attr('answer'))got = utils.ParseNumber(answer)

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas29

got = utils.ParseNumber(answer) if (got is None) or (expected is None): annotation = '‘elif got == expected: annotation = html.img(src='right.gif')else: annotation = html.img(src='wrong.gif‘)return html.p[

self.children_handle_request(answer_dict,**kw), ' ',

html.input(type="text",name=id,value=answer,size='5'), ' ', annotation ] tags = {'question':tag_question}

Page 30: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Prerrequisitos de esta temática

● Asignatura de Software de Comunicaciones, http://www.it.uc3m.es/pbasanta/SOFTCOM

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas30

Page 31: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Trabajo propio del alumno asociado a la sesión

● Tutorial de PHP (Básico, Avanzado, Base de Datos, referencia): http://www.w3schools.com/php/default.asp

● Tutorial de CGI y Perl (Introduction, overview, variables, scalars, arrays, if/else, loopings, database management, cgi programming:

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas31

cgi programming: http://www.tutorialspoint.com/perl/index.htm

● Información sobre programación Web con python en XTutor (todos los enlaces de XDocs y tag handlers), http://scripts.mit.edu/~cjt/xtutor/

Page 32: Tecnologías de Servidor: PHP, CGI, programación Web con python · Tecnologías de Servidor Al igual que J2EE, hay otras tecnologías de servidor en otros lenguajes de programación

Referencias Extra

● Practical PHP Programming, http://www.tuxradar.com/practicalphp

● Tim Converse, Joyce Park, “PHP bible”, Wiley Publishing, 2002

● W. E. Weinman, “The CGI book”, New Riders Pub, 1996

● Tutorial de programación en python,

Pedro J. Muñoz Merino Diseño de Aplicaciones Telemáticas32

● Tutorial de programación en python, http://docs.python.org/tutorial/