Professional Documents
Culture Documents
DE APLICACIONES WEB
CON DJANGO
Manuel Saelices
msaelices@yaco.es
1
Índice de contenidos
2
Índice de contenidos
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
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
8
¿Qué pedir a un framework web?
9
¿Qué pedir a un framework web?
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?
14
¿Qué pedir a un framework web?
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
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?
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
print “Hola mundo”
24
Python, ejemplo de lenguaje ágil
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
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
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
34
Introducción a Django
35
Introducción a Django
36
Introducción a Django
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()
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
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
54
Demo de desarrollo en Django
DEMO
55
Índice de contenidos
56
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
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?
63