Laboratorio de Servicios Web Grupo de Sistemas y Comunicaciones gsyc-profes@gsyc.escet.urjc.es 2009 1
(c) GSyC, Grupo de Sistemas y Comunicaciones, 2007 http://gsyc.escet.urjc.es Se permite copiar, distribuir, exhibir, comunicar la obra, crear obras derivadas y hacer uso comercial de este trabajo bajo la condición de reconocer y dar crédito al autor original (Creative Commons Attribution License 2.0) 2
Primera aplicación con Django 3
Objetivos Comprender cómo funciona la web y las tecnologías que la hacen funcionar Aprenderemos teoría practicando Aprender mejores prácticas de desarrollo web Hacer una aplicación real: Gsycbook (una copia simple de Facebook) Cómo? Usaremos Django
Qué es Django? Entorno integrado de desarrollo de aplicaciones web Herramientas para gestionar la aplicación Framework de capa de presentación Acceso a base de datos (mapeo objeto-relacional) Seguridad (XSS, SQL Injection,...) Componentes listos para usar (gestión de usuarios, sesiones, interfaz administración,...) Cache, internacionalización, plantillas, etc.
Dónde encaja Django? Enfoques más comunes de desarrollo web Frameworks de desarrollo web PHP, JavaEE, Python+HttpServer,... Entornos de desarrollo web completos Django Ruby on Rails CakePHP (casi completo) Grails y RIFE (JavaEE) Plataformas extensibles CMS: Joomla, Drupal,... Portal: Plone/Zope, Liferay Portal,... Plataformas de prop. específico: Moodle,... + Libertad + Funcionalidades y herramientas de serie
Conceptos de Django Objetivo principal: desarrollo Super-Rápido: Entorno integrado y completo Cambios en caliente Descripciones de error muy descriptivas Convenciones preferible a configuración Evitar duplicación a toda costa (DRY) etc. Desarrollo dirigido por el modelo Se empieza diseñando el modelo de datos
Preparativos Django ya está instalado en el laboratorio: versión 1.0 Para poder usarlo añade lo siguiente en el fichero $HOME/.bashrc: export PATH=$PATH:/opt/django/django/bin/ export PYTHONPATH=/opt/django/ Instrucciones de instalación (para casa): http://docs.djangoproject.com/en/dev/topics/install/ Confirma la instalación de python y django: $ python --version $ django-admin.py --version
Comandos: Proyectos y Aplicaciones $ django admin.py startproject [proyecto] proyecto$ python manage.py startapp [aplicación] proyecto$ python manage.py help Ejercicio 1: 1. Crea un proyecto llamado gsycbook - Examina los directorios y ficheros que han sido creados 2. Crea en el proy. una aplicación llamada profiles - Examina los directorios y ficheros que han sido creados 3. Averigua como ejecutar el servidor de Django en el puerto 8000 y accede a él con un navegador
Ficheros de un proyecto Django init.py: fichero vacío que indica que este directorio debe ser considerado un paquete. manage.py: herramienta para gestionar el proyecto. settings.py: configuración del proyecto urls.py: declaración de las URLs de las aplicaciones del proyecto [aplicación]/models.py: contiene la definición de las clases del modelo de dominio de la aplic. [aplicación]/views.py: contiene las vistas (código invocado por una URL) de la aplicación
Fichero settings.py Fichero en configuración ( en Python!) Contiene Configuración de la base de datos: DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'gsycbook.sqlite' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = '' Aplicaciones instaladas: INSTALLED_APPS = ( 'gsycbook.profiles', ) Otros: zona horaria, codificación, directorio de plantillas,...
Base de datos Django soporta muchas bases de datos MySQL, PostgreSQL, Sqlite3 Sqlite3 cómoda para desarrollo Se ejecuta junto a la aplicación Los datos están en un fichero Acceso a la consola de la base de datos: $python manage.py dbshell Creación automática de tablas $python manage.py syncdb
Definición del modelo (1) Cada aplicación tiene un fichero donde debe definir (o importar) los modelos: Ejemplo: profiles/models.py Se crea una clase por cada entidad (tabla) del modelo Se crea un campo por cada dato (columna) de la entidad Ejemplo: class Profile(models.Model): name = models.charfield(max_length=200) age = models.integerfield()
Definición del modelo (2) Tipos de campos CharField(max_length) SlugField(max_length, db_index, unique) IntegerField() DateField() BooleanField() Relaciones: ForeignKey(Profile) ManyToManyField('self', symmetrical=false) Más http://docs.djangoproject.com/en/dev/topics/db/models/
Más comandos del proyecto python manage.py runserver [puerto] Ejecuta el servidor integrado python manage.py shell Permite ejecutar una consola de python con acceso al código de la aplicación python manage.py validate Valida los modelos creados python manage.py sql <aplicacion> Muestra el código SQL generado a partir del modelo python manage.py loaddata Importa datos en la base de datos Más: http://docs.djangoproject.com/en/dev/ref/django-admin/
Ejercicio 2 1. Edita settings.py, configura la base de datos sqlite3 y registra la aplicación 'profiles' (elimina el resto de aplicaciónes registradas) 2. Edita el fichero profiles/models.py y crea una clase llamada Profile que modele un perfil de usuario con al menos los siguientes campos usando el tipo de campo y opciones más apropiadas posibles: Obligatorios: nombre Opcionales: apellido, nick (valor único), cita favorita, ciudad natal 3. Usa los comandos de manage.py para validar, mostrar el modelo en SQL y cargar en la base de datos las tablas necesarias para este modelo. 4. Confirma que las tablas han sido creadas usando la consola de la base de datos Usa el comando.help para consultar los comandos disponibles
Consultas a la base de datos Django proporciona automáticamente una serie de métodos para realizar consultas a la base de datos Se accede a las entradas de la bd por medio del objeto 'objects' (ej. Profile.objects) Métodos: profile.save() Profile.objects.all() Profile.objects.filter(campo=valor) Profile.objects.get(campo=valor) Lanza excepción si no lo en cuentra Más: http://docs.djangoproject.com/en/dev/topics/db/queries/
La shell de Django La shell permite acceder a la API de los objetos de nuestro proyecto: python manage.py shell >>> from gsycbook.profiles.models import Profile >>> Profile.objects.all() [] >>> p = Profile(name='Jorge') >>> p.save() >>> p.id 1 >>> Profile.objects.filter(name='Jorge')... >>> Profile.objects.get(pk=1)...
1. Usa de la shell para: Ejercicio 3 Introducir cuatro perfiles de usuario diferentes Realizar búsquedas que devuelvan 1, 2 y 3 usuarios 2. Exporta los datos de la base de datos a JSON y XML 3. Borra la base de datos y vuelve a crearla 4. Importa los datos exportados 5. Usa shell y dbshell para confirmar que los datos han sido cargados
Declaración de URLs Definición de URLs En el fichero urls.py Usa expresiones regulares para asociar URLs (sin parámetros) a vistas Ejemplo: urlpatterns = patterns('', ) (r'^profiles/hola', 'gsycbook.profiles.views.say_hello',), (r'^profiles/adios/(.*)', 'gsycbook.profiles.views.say_bye_to',),
Views Views: código que es invocado ante una petición para una URL o conjunto de URLs. Debe ser un método (o un objeto) Los métodos se definen en el fichero profiles/views.py Ejemplo: from django.http import HttpResponse def say_hello(request): return HttpResponse('Hola') def say_bye(request, name): return HttpResponse('Adios %s'%name)
Acceso al modelo desde las vistas Las vistas pueden usarse para acceder al modelo para lectura y modificación: def get_profile(request, nick): profile = Profile.objects.get(nick=nick) profiletext = Nombre: %s % profile.name return HttpResponse(profileText) def get_all_profiles(request): profiles = Profile.objects.all() profilestext = Lista de usuarios: profilestext += Nombre: %s % profiles[0].name... return HttpResponse(profilesText)
Ejercicio 4 1. Crea una vista que responda a la URL /profiles/pepe y muestre datos inventados de un usuario 2. Modifica la expresión regular de urls.py y la vista anteriores de un perfil concreto de la base de datos al invocar /profiles/{nick} 3. Crea una vista que responda a la URL /profiles y muestre una lista con los nombres usuarios dados de alta y un enlace para ver el perfil completo. 4. Comprueba el correcto funcionamiento con el navegador
Referencias Imprescindibles Documentación de Django http://docs.djangoproject.com/en/dev/ Libro de Django (en elaboración) http://www.djangobook.com/en/1.0/ Tutorial de Python http://docs.python.org/tutorial/ Referencia de Python lib http://docs.python.org/reference/
Doc. SQLite3 Otras referencias http://www.sqlite.org/docs.html http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html Comunidad de Django Inglés: Lista: http://groups.google.com/group/django-users Código: http://www.djangosnippets.org/ Español: http://django.es/