You are on page 1of 63

PROGRAMACIÓN ÁGIL

DE APLICACIONES WEB
CON DJANGO

Manuel Saelices
msaelices@yaco.es

1
Í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

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
Introducción metodologías ágiles

 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
4
Introducción metodologías ágiles

 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

5
Introducción metodologías ágiles

ASERTO:
TODO DESARROLLO SOFTWARE ES MUY
SUSCEPTIBLE AL CAMBIO DE
REQUISITOS

6
Introducción metodologías ágiles

 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
7
Í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

8
¿Qué pedir a un framework web?

“La belleza conduce a la felicidad, y la


felicidad conduce a la productividad”
David Heinemeier Hanson,
creador de Ruby on Rails

9
¿Qué pedir a un framework web?

 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 ;-)
10
¿Qué pedir a un framework web?

 ¿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
11
¿Qué pedir a un framework web?

 ¿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

12
¿Qué pedir a un framework web?

 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

13
¿Qué pedir a un framework web?

 ¿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

14
¿Qué pedir a un framework web?

 ¿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
15
¿Qué pedir a un framework web?

 ¿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.

16
¿Qué pedir a un framework web?

 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

17
Í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

18
¿Es J2EE ágil?

 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
19
¿Es J2EE ágil?

 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
20
Í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

21
Python, ejemplo de lenguaje ágil

 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

22
Python, ejemplo de lenguaje ágil

 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

23
Python, ejemplo de lenguaje ágil

 Python vs Java (ejemplos)


 “Hola mundo”
 Java
public class HolaMundo
{
    public static void main (String[] args)
    {
        System.out.println("Hola mundo");
    }
}

 Python
print “Hola mundo”

24
Python, ejemplo de lenguaje ágil

 Python vs Java (ejemplos)


 Leer de un fichero
 Java
import java.io.*;

BufferedReader fichero =
    new BufferedReader(
        new FileReader(“entrada.txt”));

while((linea=fichero.readLine())!=null)
System.out.println(linea);

 Python
fichero = open('entrada.txt')

for linea in fichero:
    print linea
25
Í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

26
Introducción a Django

 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.

27
Introducción a Django

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

28
Introducción a Django

 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
 ... 29
Introducción a Django

 Aplicaciones web reutilizables


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

 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/

31
Introducción a Django

 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)

32
Introducción a Django

 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
33
Introducción a Django

 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.

34
Introducción a Django

 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;
   }
 } 

35
Introducción a Django

 Django ORM vs. Hibernate


 Ejemplo definición Hibernate
<?xml version="1.0"?>
<!DOCTYPE hibernate­mapping PUBLIC "­//Hibernate/Hibernate Mapping 
DTD 2.0//EN" “http://hibernate.sourceforge.net/hibernate­mapping­
2.0.dtd">
<hibernate­mapping>
  <class name="com.example.model.Equipo" table="equipos">
    <id name="id" column="id"> <generator class="native"/></id>
    <property name="nombre" column="nombre"/>
  </class>
</hibernate­mapping>

36
Introducción a Django

 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(); 

37
Introducción a Django

 Diseño de URLs
 No se quieren URLs horribles
 foo.es/bar/s_view/infrastructure/0,2545,TC
P167364285088,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/
38
Introducción a Django

 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),
)

39
Introducción a Django

 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})
   
40
Introducción a Django

 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

41
Introducción a Django

 Plantillas
 Ejemplo:
{% extends "base.html" %}
{% block contenido %}
 <ul>
   {% for n in noticias %}
   <li>
     <a href="/noticias/{{ n.id }}/">
      {{ n.titulo|upper }}
     </a>
   </li>
   {% endfor %}
 </ul>
{% endblock %}
42
Introducción a Django

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

43
Introducción a Django

 Formularios
 Ejemplos simples:
 Formulario no asociado a modelo
from django import forms

class ContactoForm(forms.Form):
nombre = models.CharField()
email = models.EmailField()

 Formulario asociado a modelo


from django import forms
from equipo.models import Equipo

class EquipoForm(forms.ModelForm):
class Meta:
model = Equipo
44
Introducción a Django

 Formularios
 Uso en consola:
>>> from equipos.forms import EquipoForm
>>> form = EquipoForm()
>>> print form
<tr><th><label 
for="id_nombre">Nombre:</label></th><td><input 
id="id_nombre" type="text" name="nombre" 
maxlength="100" /></td></tr>
>>> print form.as_p()
<p><label for="id_nombre">Nombre:</label> <input 
id="id_nombre" type="text" name="nombre" 
maxlength="100" /></p>
... (cont.)
   
45
Introducción a Django

>>> from equipos.models import Equipo
>>> equipo = Equipo.objects.get(nombre='Real Madrid')
>>> form = EquipoForm(instance=equipo)
>>> print form.as_p()
<p><label for="id_nombre">Nombre:</label> <input 
id="id_nombre" type="text" name="nombre" value="Real 
Madrid" maxlength="100" /></p>
>>> 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.']}
46
Introducción a Django

 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 })
47
Introducción a Django

 Formularios
 En plantilla:
{% extends "base.html" %}
{% block contenido %}
 <form action="." method="POST">
   {{ form.as_p }}
   <input type="submit" value="Guardar equipo" />
 </form>
{% endblock %}

48
Introducción a Django

 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())

49
Introducción a Django

 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

http://docs.djangoproject.com/en/dev/topics/http/middleware/
 Caché
 Caché en varios niveles
 Varios backends:
memcached, locmem, db, sistema de ficheros
http://docs.djangoproject.com/en/dev/topics/cache/
50
Introducción a Django

 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/
51
Introducción a Django

 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/

52
Introducción a Django

 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
http://docs.djangoproject.com/en/dev/ref/contrib/syndication/
 Vistas genéricas
http://docs.djangoproject.com/en/dev/ref/generic-views/
53
Í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

54
Demo de desarrollo en Django

DEMO

55
Í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

56
Django by example

 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 57
Django by example

 Página inicial
http://www.yaco.es/

58
Django by example

 Vida en Yaco
http://www.yaco.es/nosotros/vida_en_yaco/

59
Django by example

 Comunidad
http://www.yaco.es/community/actualidad/

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
Reflexiones finales

 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?

62
¿Dudas?
¿Sugerencias?

Gracias por la atención!

63

You might also like