Práctica 1 (Ejercicio 18.1): Web acortadora de URLs
Esta práctica tendrá como objetivo la creación de una aplicación web simple para acortar URLs. La aplicación tendrá que realizarse según un esquema de clases similar al explicado en clase.
El funcionamiento de la aplicación será el siguiente:
- Recurso /, invocado mediante GET. Devolverá una página HTML con un formulario. En ese formulario se podrá escribir una url, que se enviará al servidor mediante POST. Además, esa misma página incluirá un listado de todas las URLs reales y acortadas que maneja la aplicación en este momento.
- Recurso /, invocado mediante POST. Si el comando POST incluye una qs (query string) que corresponda con una url enviada desde el formulario, se devolverá una página HTML con la url original y la url acortada (ambas como enlaces pinchables), y se apuntará la correspondencia (ver más abajo).
Si el POST no trae una qs que se haya podido generar en el formulario, devolverá una página HTML con un mensaje de error.
Si la URL especificada en el formulario comienza por http:// o https://, se considerará que ésa es la URL a acortar. Si no es así, se le añadirá http:// por delante, y se considerará que esa es la url a acortar. Por ejemplo, si en el formulario se escribe http://gsyc.es, la url a acortar será http://gsyc.es. Si se escribe gsyc.es, la URL a acortar será http://gsyc.es.
Para determinar la URL acortada, utilizará un número entero secuencial, comenzando por 0, para cada nueva petición de acortamiento de una URL que se reciba. Si se recibe una petición para una URL ya acortada, se devolverá la URL acortada que se devolvió en su momento.
Así, por ejemplo, si se quiere acortar
y la aplicación está en el puerto 1234 de la máquina localhost, se invocará (mediante POST) la URL
y en el cuerpo de esa petición HTTP irá la qs
url=http://docencia.etsit.urjc.es
si el campo donde el usuario puede escribir en el formulario tiene el nombre URL. Normalmente, esta invocación POST se realizará rellenando el formulario que ofrece la aplicación.
Como respuesta, la aplicación devolverá (en el cuerpo de la respuesta HTTP) la URL acortada, por ejemplo
Si a continuación se trata de acortar la URL
http://docencia.etsit.urjc.es/moodle/course/view.php?id=25
mediante un procedimiento similar, se recibirá como respuesta la URL acortada
Si se vuelve a intentar acortar la URL
como ya ha sido acortada previamente, se devolverá la misma URL corta:
- Recursos correspondientes a URLs acortadas. Estos serán números con el prefijo /. Cuando la aplicación reciba un GET sobre uno de estos recursos, si el número corresponde a una URL acortada, devolverá un HTTP REDIRECT a la URL real. Si no la tiene, devolverá HTTP ERROR Recurso no disponible.
Por ejemplo, si se recibe
la aplicación devolverá un HTTP REDIRECT a la URL
Se recomienda utilizar la clase webApp del fichero webapp.py, heredando de la misma. La funcionalidad de esta práctica debería implementarse en el fichero practica1.py.
Se recomienda utilizar dos diccionarios para almacenar las URLs reales y los números de las URLs acortadas. En uno de ellos, la clave de búsqueda será la URL real, y se utilizará para saber si una URL real ya está acortada, y en su caso saber cuál es el número de la URL corta correspondiente.
En el otro diccionario la clave de búsqueda será el número de la URL acortada, y se utilizará para localizar las URLs reales dadas las cortas. De todas formas, son posibles (e incluso más eficientes) otras estructuras de datos.
Se recomienda realizar la aplicación en varios pasos:
- Comenzar por reconocer GET /, y devolver el formulario correspondiente.
- Reconocer POST /, y devolver la página HTML correspondiente (con la URL real y la acortada).
- Reconocer GET /num (para cualquier número num), y realizar la redirección correspondiente.
- Manejar las condiciones de error y realizar el resto de la funcionalidad.
Has de tener un repositorio llamado X-Serv-18.1-Practica1 en tu cuenta en GitHub que incluya el fichero de nombre 'practica1.py' que contenga las instrucciones en Python para solucionar el ejercicio.
Se proporciona un script, check.py, para comprobar la entrega correcta del ejercicio. El script de comprobación se ha de ejecutar desde terminal pasándole como parámetro tu nombre de usuario en GitHub. Así, un ejemplo de ejecución sería:
$ python check.py gregoriorobles