1 Manuel Saelices PROGRAMACIÓN ÁGIL DE APLICACIONES WEB CON DJANGO.

1 1 Manuel Saelices [email protected] PROGRAMACIÓN ÁGIL D...
Author: Gabriel Ferreyra Paz
0 downloads 3 Views

1 1 Manuel Saelices [email protected] PROGRAMACIÓN ÁGIL DE APLICACIONES WEB CON DJANGO

2 2 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

3 3 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

4 4 Metodologías tradicionales Hacen énfasis en la planificación Etapas definidas Análisis de requisitos Especificación y diseño del sistema Implementación Pruebas Documentación Principal problema: Es una metodología pesada No responde bien ante el cambio Introducción metodologías ágiles

5 5 Problemas en desarrollo software El cliente no sabe de tecnología no sabe lo que quiere, si no lo ve antes prefiere algo funcional que leer un diseño Es difícil tener todos los cabos atados La tecnología cambia rápido Siempre surgen problemas Introducción metodologías ágiles

6 6 ASERTO: TODO DESARROLLO SOFTWARE ES MUY SUSCEPTIBLE AL CAMBIO DE REQUISITOS Introducción metodologías ágiles

7 7 Metodologías ágiles Se enfrentan a las metodologías tradicionales Énfasis en la adaptabilidad del proceso Agilizan los procesos de desarrollo Da por hecho que los requisitos cambiarán Intenta: Prever el cambio lo antes posible: entrega constante Responder al cambio de forma rápida Introducción metodologías ágiles

8 8 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

9 9 “La belleza conduce a la felicidad, y la felicidad conduce a la productividad” David Heinemeier Hanson, creador de Ruby on Rails ¿Qué pedir a un framework web?

10 10 El proceso en un framework web debe ser Ágil Rápido de desarrollar Rápido ciclo de desarrollo Flexible Facilitar el despliegue Simple Código legible, mantenible y bello Convención sobre configuración Divertido ;-) ¿Qué pedir a un framework web?

11 11 ¿Cómo ser ágil? Automatizar/eliminar tareas repetitivas DRY (Don't Repeat Yourself) En instalación y despliegue En desarrollo sistema de permisos y usuarios construcción/validación de formularios creación del modelo de datos creación de datos de prueba Rápido ciclo de desarrollo Eliminar necesidad de reinicios Sistema de recarga de librerías ¿Qué pedir a un framework web?

12 12 ¿Cómo ser ágil? Utilizar un ORM (Object Relational Mapper) Abstrae de la base de datos: Flexibilidad ante el cambio de requisitos Reutilización para otros proyectos La máquina crea el SQL El código resulta más legible Aumenta la seguridad de tu sistema No hay inyección SQL Menos fallos en programación ¿Qué pedir a un framework web?

13 13 Sin ORM cursor.execute(“SELECT * FROM personas \ WHERE edad=” + 20) for row in cursor.fetchall(): id = row[0] edad = row[1] cursor.execute(“UPDATE personas WHERE id=%s \ SET edad=%d” % (id, edad+1)) Con ORM for p in Personas.listado(edad=20): # ejecuta SELECT p.edad = p.edad + 1 p.nombre = “Juan” p.update() # ejecuta UPDATE ¿Qué pedir a un framework web?

14 14 ¿Cómo ser ágil? Instalación y despliegue Scripts de automatización para todo Creación automática del esquema de datos Creación automática de datos de prueba Integración de sistema de testeo Tests unitarios, de carga y funcionales Te quita el miedo a: Refactorizar el código Incluir nuevas funcionalidades Recuerda: buscamos adaptabilidad ¿Qué pedir a un framework web?

15 15 ¿Cómo ser simple? Lenguaje de programación simple simple + legible = código mantenible el código es leído mucho más que escrito Framework que oriente a formar sistemas simples resulte fácilmente mantenible Convención sobre configuración no quiero configurar 10 ficheros XML debe convenirse la norma común sólo configurar la excepción a la norma ¿Qué pedir a un framework web?

16 16 ¿Cómo ser simple? Sobre herramientas y wizards Te generan parte del código Te configuran los ficheros XMLs Todo muy bien, pero: Los wizards NO son la excusa RECUERDA: El código es leído más que escrito La base debe ser simple. ¿Qué pedir a un framework web?

17 17 Por último Fácilmente integrable con “otros” Eficiente y escalable Mejor explícito que implícito Minimizar la magia Separar capas Datos/Lógica/Presentación Permitir las buenas metodologías No obligarte a un IDE concreto Permitir sistema de control de versiones ¿Qué pedir a un framework web?

18 18 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

19 19 Respuesta: NO API Compleja Lenguaje compilado y “verboso” Configuración compleja Muchos ficheros XMLs Errores de compilación detectados en ejecución Lento ciclo de desarrollo Compilar todo Generar.war Muchas veces, reiniciar Tomcat ¿Es J2EE ágil?

20 20 Mecanismos agilización J2EE IDEs de desarrollo Completan el código (setters, getters, etc.) Mantienen XML sincronizados Facilitan el despliegue Tienen wizards, plugins, herramientas Generan código Diseñadores gráficos Ejemplos: MyEclipse, JDeveloper, etc. Sigue habiendo un problema: La base debe ser ágil ¿Es J2EE ágil?

21 21 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

22 22 Lenguaje Python Interpretado Fácil de aprender Indentado def load_comics(path): comics = {} file = open(path) for line in file.read(): url, name = line.split(':') comics[url] = name.strip() return comics Python, ejemplo de lenguaje ágil

23 23 Python vs Java Python algo más lento APIs similares Python más productivo Tipado dinámico (duck typing) Shell interactiva Código más limpio Menos “verboso” Escribes menos Java innecesariamente complejo: VallijaFactory http://www.abelgonzalez.com/entornosabiertos/no-olvides-el-vajillafactory_p154.html Python, ejemplo de lenguaje ágil

24 24 Python vs Java (ejemplos) “Hola mundo” Java Python Python, ejemplo de lenguaje ágil public class HolaMundo { public static void main (String[] args) { System.out.println("Hola mundo"); } print “Hola mundo”

25 25 Python vs Java (ejemplos) Leer de un fichero Java Python Python, ejemplo de lenguaje ágil import java.io.*; BufferedReader fichero = new BufferedReader( new FileReader(“entrada.txt”)); while((linea=fichero.readLine())!=null) System.out.println(linea); fichero = open('entrada.txt') for linea in fichero: print linea

26 26 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

27 27 Características básicas Lenguaje Python Desarrollo muy rápido Similar Ruby on Rails Busca el perfeccionismo Patrón MVC Amplia comunidad Hermanos mayores como Google Ejemplo: Google App Engine sólo soporta python e integra Django por defecto. Introducción a Django

28 28 Diseño perfeccionista Código muy legible Exquisita metodología desarrollo Perfecta documentación Componentes fundamentales ORM Diseñador URLs Vistas (~controladores) Plantillas Introducción a Django

29 29 Otros componentes out-of-the-box Interfaz administración automática Sistema de formularios Sistema de autenticación/autorización Internacionalización Sistema de caché Framework de sindicación Framework testing unitario y funcional Serializador XML y JSON Sistema GIS... Introducción a Django

30 30 Aplicaciones web reutilizables Tagging Wiki Foros CMS Blog... Más en http://www.djangoplugables.com/ http://code.google.com/ Introducción a Django

31 31 Recursos básicos Documentación oficial http://docs.djangoproject.com/ Wiki, SVN, Tickets, etc. http://code.djangoprojects.com/ Algunos sitios web en Django http://www.djangosites.org/ Introducción a Django

32 32 Modelo de datos Usa un ORM propio Simple y poderoso Ejemplo de definición class Equipo(models.Model): nombre = models.CharField(max_length=100) class Jugador(models.Model): nombre = models.CharField(max_length=100) equipo = models.ForeignKey(Equipo) Introducción a Django

33 33 Modelo de datos Ejemplo de uso >>> madrid = Equipo(nombre='Real Madrid') >>> madrid.save() # ejecuta INSERT >>> jug = Jugador(nombre='Raul', equipo=madrid) >>> jug.save() # ejecuta INSERT >>> jug.equipo.nombre 'Real Madrid' >>> jug2 = Jugador(nombre='Casillas', equipo=madrid) >>> jug2.save() >>> for j in Jugador.objects.all(): # efectua SELECT... print j.nombre Raul Casillas Introducción a Django

34 34 ORM Django vs. Hibernate Hibernate: ORM de Java más usado Hibernate más flexible Permite definir tus propios mappings Aumenta complejidad Quiere cubrir 100% de casuística Django ORM más simple Código más legible y mantenible Desarrollo mucho más rápido Quiere cubrir 99% casuística. Para todo lo demás, SQL. Introducción a Django

35 35 ORM Django vs. Hibernate Ejemplo definición Hibernate public class Equipo { private Long id; private String nombre; public Long getId() { return id;} public void setId(id){ this.id = id;} public String getNombre() { return nombre; } public void setNombre(String nombre){ this.nombre = nombre; } Introducción a Django

36 36 Django ORM vs. Hibernate Ejemplo definición Hibernate Introducción a Django

37 37 Django ORM vs. Hibernate Ejemplo uso Hibernate... Configuration cfg = new Configuration(); cfg.addResource("Project.hbm.xml"); cfg.setProperties(System.getProperties()); SessionFactory sf = cfg.buildSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); Equipo equipo = new Equipo(); equipo.setNombre("Real Madrid"); s.save(project); tx.commit(); s.close(); Introducción a Django

38 38 Diseño de URLs No se quieren URLs horribles foo.es/bar/s_view/infrastructure/0,2545,TCP167 364285088,00.html foo.es/noticias.php?anyo=2006 Independencia entre URLs y lógica de aplicación Se quiere arquitectura REST foo.es/noticias/2008/ foo.es/noticias/crear/ foo.es/noticias/conf-oswc/borrar/ Introducción a Django

39 39 Diseño de URLs Se implementan con expresiones regulares Hay un mappeador de URLs Proporciona seguridad Enlazan con las vistas (controlador) Ejemplo: from news.views import caso_especial_03, lista_anual urlpatterns = patterns('', ('^noticias/2003/$', caso_especial_03), ('^noticias/(\d{4})/$', lista_anual), ) Introducción a Django

40 40 Vistas Realizan la lógica de la aplicación Es parecido al controlador MVC Suele renderizar una plantilla Ejemplo: from news.models import Noticia def lista_anual(request, anyo): noticias = Noticia.objects.filter(anyo=anyo) return render_to_response('noticias.html', {'noticias': noticias}) Introducción a Django

41 41 Plantillas Filosofía No incluir lógica en plantillas No usar XML (no sólo pensado para HTML) Facilitar la sintaxis para el diseñador Lenguaje propio Muy legible Soporta herencia de plantillas Extensible Introducción a Django

42 42 Plantillas Ejemplo: {% extends "base.html" %} {% block contenido %} {% for n in noticias %} {{ n.titulo|upper }} {% endfor %} {% endblock %} Introducción a Django

43 43 Formularios Librería incluida en Django Dos tipos django.forms.Form, caso general django.forms.ModelForm, sobre modelos Componentes Formularios Campos Widgets Introducción a Django

44 44 Formularios Ejemplos simples: Formulario no asociado a modelo Formulario asociado a modelo Introducción a Django from django import forms class ContactoForm(forms.Form): nombre = models.CharField() email = models.EmailField() from django import forms from equipo.models import Equipo class EquipoForm(forms.ModelForm): class Meta: model = Equipo

45 45 Formularios Uso en consola: >>> from equipos.forms import EquipoForm >>> form = EquipoForm() >>> print form Nombre: >>> print form.as_p() Nombre:... (cont.) Introducción a Django

46 46 >>> from equipos.models import Equipo >>> equipo = Equipo.objects.get(nombre='Real Madrid') >>> form = EquipoForm(instance=equipo) >>> print form.as_p() Nombre: >>> datos_peticion_post = {'nombre': 'Barcelona'} >>> form = EquipoForm(datos_peticion_post) >>> nuevo_equipo = form.save() # ejecuta sql INSERT >>> datos_incorrectos = {'nombre': ''} >>> form = EquipoForm(datos_peticion_post) >>> form.is_valid() False >>> form.errors() {'nombre': [u'This field is required.']} Introducción a Django

47 47 Formularios En vista Django: from equipos.forms import EquipoForm def crea_equipo(request): if request.method == 'POST': # peticion POST con formulario relleno form = EquipoForm(request.POST) if form.is_valid(): return HttpResponseRedirect('/gracias/') else: # formulario sin rellenar form = EquipoForm() return render_to_response('crea_equipo.html', {'form': form }) Introducción a Django

48 48 Formularios En plantilla: {% extends "base.html" %} {% block contenido %} {{ form.as_p }} {% endblock %} Introducción a Django

49 49 Formularios Ejemplo más complejo from django import forms from django.forms.widgets import Textarea class ContactoForm(forms.Form): asunto = models.CharField() email = models.EmailField() edad = models.IntegerField(min_value=0) cuerpo = models.CharField(required=False, widget=Textarea()) Introducción a Django

50 50 Otros componentes Middlewares Hooks situados entre tu web y el navegador Ejemplos Cambio de idioma según lenguaje navegador Ofuscación de toda ocurrencia de emails Caché Caché en varios niveles Varios backends: memcached, locmem, db, sistema de ficheros http://docs.djangoproject.com/en/dev/topics/cache/ Introducción a Django http://docs.djangoproject.com/en/dev/topics/http/middleware/

51 51 Otros componentes Autenticación/autorización Contiene: Usuarios, grupos y permisos Controladores de acceso... http://docs.djangoproject.com/en/dev/topics/auth/ I18N Librería para automatizar Cambio de idioma Regeneración de catálogos... http://docs.djangoproject.com/en/dev/topics/i18n/ Introducción a Django

52 52 Otros componentes Serialización Te permite guardar los datos a XML Independencia de BD Permite testeo en local Sirve de copia de seguridad http://docs.djangoproject.com/en/dev/topics/serialization/ Sistema de testeo Django tiene miles de tests Tu aplicación puede usar mismo sistema http://docs.djangoproject.com/en/dev/topics/testing/ Introducción a Django

53 53 Aún más componentes Sesiones http://docs.djangoproject.com/en/dev/topics/http/sessions/ Señales http://docs.djangoproject.com/en/dev/topics/signals/ Interfaz de administración http://docs.djangoproject.com/en/dev/ref/contrib/admin/ Sindicación RSS/Atom Vistas genéricas http://docs.djangoproject.com/en/dev/ref/generic-views/ Introducción a Django http://docs.djangoproject.com/en/dev/ref/contrib/syndication/

54 54 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

55 55 DEMO Demo de desarrollo en Django

56 56 Ejemplo a analizar: Web de Yaco http://www.yaco.es/ Desarrollada 100% en Django Funcionalidades a mostrar Implementación general Agregación RSS Editor inline Middleware Caché Análisis Código Django resultante Resultado final Django by example

57 57 Página inicial http://www.yaco.es/ Django by example

58 58 Vida en Yaco http://www.yaco.es/nosotros/vida_en_yaco/ Django by example

59 59 Comunidad http://www.yaco.es/community/actualidad/ Django by example

60 60 Índice de contenidos 1. Introducción a metodologías ágiles 2. ¿Qué pedir a un framework web? 3. ¿Es J2EE ágil? 4. Python, ejemplo de lenguage ágil 5. Introducción a Django 6. Demo, desarrollo en Django 7. Django by example 8. Reflexiones finales

61 61 Reflexiones finales ¿Es necesario replantearse el proceso de desarrollo de aplicaciones web? ¿J2EE es siempre una buena elección para el desarrollo web? ¿Son los entornos comerciales realmente tan productivos como prometen sus fabricantes? ¿Algún día veremos el límite de posibilidades que trae Django? Reflexiones finales

62 62 Gracias por la atención! ¿Dudas? ¿Sugerencias?