You are on page 1of 63

PROGRAMACIN GIL DE APLICACIONES WEB CON DJANGO

Manuel Saelices msaelices@yaco.es

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

Introduccin metodologas giles

Metodologas tradicionales

Hacen nfasis en la planificacin Etapas definidas


Anlisis de requisitos Especificacin y diseo del sistema Implementacin Pruebas Documentacin Es una metodologa pesada No responde bien ante el cambio
4

Principal problema:

Introduccin metodologas giles

Problemas en desarrollo software

El cliente

no sabe de tecnologa no sabe lo que quiere, si no lo ve antes prefiere algo funcional que leer un diseo

Es difcil tener todos los cabos atados La tecnologa cambia rpido Siempre surgen problemas

Introduccin metodologas giles

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

Introduccin metodologas giles

Metodologas giles

Se enfrentan a las metodologas tradicionales nfasis en la adaptabilidad del proceso Agilizan los procesos de desarrollo Da por hecho que los requisitos cambiarn Intenta:

Prever el cambio lo antes posible: entrega constante Responder al cambio de forma rpida
7

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

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

Qu pedir a un framework web?

El proceso en un framework web debe ser

gil

Rpido de desarrollar Rpido ciclo de desarrollo Flexible Facilitar el despliegue Cdigo legible, mantenible y bello Convencin sobre configuracin Divertido ;-)
10

Simple

Qu pedir a un framework web?

Cmo ser gil?

Automatizar/eliminar tareas repetitivas


DRY (Don't Repeat Yourself) En instalacin y despliegue En desarrollo


sistema de permisos y usuarios construccin/validacin de formularios creacin del modelo de datos creacin de datos de prueba

Rpido ciclo de desarrollo


Eliminar necesidad de reinicios Sistema de recarga de libreras


11

Qu pedir a un framework web?

Cmo ser gil?

Utilizar un ORM (Object Relational Mapper)

Abstrae de la base de datos:


Flexibilidad ante el cambio de requisitos Reutilizacin para otros proyectos

La mquina crea el SQL El cdigo resulta ms legible Aumenta la seguridad de tu sistema


No hay inyeccin SQL Menos fallos en programacin

12

Qu pedir a un framework web?

Sin ORM
cursor.execute(SELECT*FROMpersonas\ WHEREedad=+20) forrowincursor.fetchall(): id=row[0] edad=row[1] cursor.execute(UPDATEpersonasWHEREid=%s\ SETedad=%d%(id,edad+1))

Con ORM
forpinPersonas.listado(edad=20):#ejecutaSELECT p.edad=p.edad+1 p.nombre=Juan p.update()#ejecutaUPDATE
13

Qu pedir a un framework web?

Cmo ser gil?

Instalacin y despliegue

Scripts de automatizacin para todo Creacin automtica del esquema de datos Creacin automtica de datos de prueba Tests unitarios, de carga y funcionales Te quita el miedo a:

Integracin de sistema de testeo


Refactorizar el cdigo Incluir nuevas funcionalidades

Recuerda: buscamos adaptabilidad


14

Qu pedir a un framework web?

Cmo ser simple?

Lenguaje de programacin simple


simple + legible = cdigo mantenible el cdigo es ledo mucho ms que escrito oriente a formar sistemas simples resulte fcilmente mantenible no quiero configurar 10 ficheros XML debe convenirse la norma comn slo configurar la excepcin a la norma
15

Framework que

Convencin sobre configuracin


Qu pedir a un framework web?

Cmo ser simple?

Sobre herramientas y wizards


Te generan parte del cdigo Te configuran los ficheros XMLs Los wizards NO son la excusa RECUERDA: El cdigo es ledo ms que escrito

Todo muy bien, pero:


La base debe ser simple.

16

Qu pedir a un framework web?

Por ltimo

Fcilmente integrable con otros Eficiente y escalable Mejor explcito que implcito

Minimizar la magia Datos/Lgica/Presentacin No obligarte a un IDE concreto Permitir sistema de control de versiones
17

Separar capas

Permitir las buenas metodologas


ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

18

Es J2EE gil?

Respuesta: NO

API Compleja Lenguaje compilado y verboso Configuracin compleja


Muchos ficheros XMLs Errores de compilacin detectados en ejecucin Compilar todo Generar .war Muchas veces, reiniciar Tomcat
19

Lento ciclo de desarrollo


Es J2EE gil?

Mecanismos agilizacin J2EE

IDEs de desarrollo

Completan el cdigo (setters, getters, etc.) Mantienen XML sincronizados Facilitan el despliegue Tienen wizards, plugins, herramientas

Generan cdigo Diseadores grficos

Ejemplos: MyEclipse, JDeveloper, etc.

Sigue habiendo un problema:

La base debe ser gil


20

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

21

Python, ejemplo de lenguaje gil

Lenguaje Python

Interpretado Fcil de aprender Indentado

defload_comics(path): comics={} file=open(path) forlineinfile.read(): url,name=line.split(':') comics[url]=name.strip() returncomics


22

Python, ejemplo de lenguaje gil

Python vs Java

Python algo ms lento APIs similares Python ms productivo


Tipado dinmico (duck typing) Shell interactiva Cdigo ms 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

publicclassHolaMundo { publicstaticvoidmain(String[]args) { System.out.println("Holamundo"); } }

Python

printHolamundo

24

Python, ejemplo de lenguaje gil

Python vs Java (ejemplos)

Leer de un fichero

Java

importjava.io.*; BufferedReaderfichero= newBufferedReader( newFileReader(entrada.txt)); while((linea=fichero.readLine())!=null) System.out.println(linea);

Python

fichero=open('entrada.txt') forlineainfichero: printlinea


25

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

26

Introduccin a Django

Caractersticas bsicas

Lenguaje Python Desarrollo muy rpido Similar Ruby on Rails Busca el perfeccionismo Patrn MVC Amplia comunidad Hermanos mayores como Google

Ejemplo: Google App Engine slo soporta python e integra Django por defecto.
27

Introduccin a Django

Diseo perfeccionista

Cdigo muy legible Exquisita metodologa desarrollo Perfecta documentacin ORM Diseador URLs Vistas (~controladores) Plantillas
28

Componentes fundamentales

Introduccin a Django

Otros componentes out-of-the-box


Interfaz administracin automtica Sistema de formularios Sistema de autenticacin/autorizacin Internacionalizacin Sistema de cach Framework de sindicacin Framework testing unitario y funcional Serializador XML y JSON Sistema GIS ... 29

Introduccin a Django

Aplicaciones web reutilizables


Tagging Wiki Foros CMS Blog ... http://www.djangoplugables.com/ http://code.google.com/


30

Ms en

Introduccin a Django

Recursos bsicos

Documentacin oficial

http://docs.djangoproject.com/ http://code.djangoprojects.com/ http://www.djangosites.org/

Wiki, SVN, Tickets, etc.

Algunos sitios web en Django

31

Introduccin a Django

Modelo de datos

Usa un ORM propio Simple y poderoso Ejemplo de definicin

classEquipo(models.Model): nombre=models.CharField(max_length=100) classJugador(models.Model): nombre=models.CharField(max_length=100) equipo=models.ForeignKey(Equipo)

32

Introduccin a Django

Modelo de datos

Ejemplo de uso

>>>madrid=Equipo(nombre='RealMadrid') >>>madrid.save()#ejecutaINSERT >>>jug=Jugador(nombre='Raul',equipo=madrid) >>>jug.save()#ejecutaINSERT >>>jug.equipo.nombre 'RealMadrid' >>>jug2=Jugador(nombre='Casillas',equipo=madrid) >>>jug2.save() >>>forjinJugador.objects.all():#efectuaSELECT ...printj.nombre Raul Casillas
33

Introduccin a Django

ORM Django vs. Hibernate


Hibernate: ORM de Java ms usado Hibernate ms flexible


Permite definir tus propios mappings Aumenta complejidad Quiere cubrir 100% de casustica Cdigo ms legible y mantenible Desarrollo mucho ms rpido Quiere cubrir 99% casustica.

Django ORM ms simple


Para todo lo dems, SQL.


34

Introduccin a Django

ORM Django vs. Hibernate

Ejemplo definicin Hibernate

publicclassEquipo{ privateLongid; privateStringnombre; publicLonggetId(){returnid;} publicvoidsetId(id){this.id=id;} publicStringgetNombre(){returnnombre;} publicvoidsetNombre(Stringnombre){ this.nombre=nombre; } }


35

Introduccin a Django

Django ORM vs. Hibernate

Ejemplo definicin Hibernate

<?xmlversion="1.0"?> <!DOCTYPEhibernatemappingPUBLIC"//Hibernate/HibernateMapping DTD2.0//EN"http://hibernate.sourceforge.net/hibernatemapping 2.0.dtd"> <hibernatemapping> <classname="com.example.model.Equipo"table="equipos"> <idname="id"column="id"><generatorclass="native"/></id> <propertyname="nombre"column="nombre"/> </class> </hibernatemapping>
36

Introduccin a Django

... Configurationcfg=newConfiguration(); cfg.addResource("Project.hbm.xml"); cfg.setProperties(System.getProperties()); SessionFactorysf=cfg.buildSessionFactory(); Sessions=sf.openSession(); Transactiontx=s.beginTransaction(); Equipoequipo=newEquipo(); equipo.setNombre("RealMadrid"); s.save(project);tx.commit();s.close();
37

Django ORM vs. Hibernate

Ejemplo uso Hibernate

Introduccin a Django

Diseo 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 lgica de aplicacin Se quiere arquitectura REST


foo.es/noticias/2008/ foo.es/noticias/crear/ foo.es/noticias/conf-oswc/borrar/


38

Introduccin a Django

Diseo de URLs

Se implementan con expresiones regulares Hay un mappeador de URLs Proporciona seguridad Enlazan con las vistas (controlador)

Ejemplo:

fromnews.viewsimportcaso_especial_03,lista_anual urlpatterns=patterns('', ('^noticias/2003/$',caso_especial_03), ('^noticias/(\d{4})/$',lista_anual), )


39

Introduccin a Django

Vistas

Realizan la lgica de la aplicacin Es parecido al controlador MVC Suele renderizar una plantilla Ejemplo:

fromnews.modelsimportNoticia deflista_anual(request,anyo): noticias=Noticia.objects.filter(anyo=anyo) returnrender_to_response('noticias.html', {'noticias':noticias})


40

Introduccin a Django

Plantillas

Filosofa

No incluir lgica en plantillas No usar XML (no slo pensado para HTML) Facilitar la sintaxis para el diseador Muy legible Soporta herencia de plantillas Extensible

Lenguaje propio

41

Introduccin a Django

Plantillas

Ejemplo:

{%extends"base.html"%} {%blockcontenido%} <ul> {%forninnoticias%} <li> <ahref="/noticias/{{n.id}}/"> {{n.titulo|upper}} </a> </li> {%endfor%} </ul> {%endblock%}
42

Introduccin a Django

Formularios

Librera incluida en Django Dos tipos


django.forms.Form, caso general django.forms.ModelForm, sobre modelos Formularios Campos Widgets

Componentes

43

Introduccin 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

Introduccin a Django

Formularios

Uso en consola:

>>>fromequipos.formsimportEquipoForm >>>form=EquipoForm() >>>printform <tr><th><label for="id_nombre">Nombre:</label></th><td><input id="id_nombre"type="text"name="nombre" maxlength="100"/></td></tr> >>>printform.as_p() <p><labelfor="id_nombre">Nombre:</label><input id="id_nombre"type="text"name="nombre" maxlength="100"/></p> ...(cont.)
45

Introduccin a Django
>>>fromequipos.modelsimportEquipo >>>equipo=Equipo.objects.get(nombre='RealMadrid') >>>form=EquipoForm(instance=equipo) >>>printform.as_p() <p><labelfor="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()#ejecutasqlINSERT >>>datos_incorrectos={'nombre':''} >>>form=EquipoForm(datos_peticion_post) >>>form.is_valid() False >>>form.errors() {'nombre':[u'Thisfieldisrequired.']}
46

Introduccin a Django

Formularios

En vista Django:

fromequipos.formsimportEquipoForm defcrea_equipo(request): ifrequest.method=='POST': #peticionPOSTconformulariorelleno form=EquipoForm(request.POST) ifform.is_valid(): returnHttpResponseRedirect('/gracias/') else:#formulariosinrellenar form=EquipoForm() returnrender_to_response('crea_equipo.html', {'form':form})
47

Introduccin a Django

Formularios

En plantilla:

{%extends"base.html"%} {%blockcontenido%} <formaction="."method="POST"> {{form.as_p}} <inputtype="submit"value="Guardarequipo"/> </form> {%endblock%}

48

Introduccin a Django

Formularios

Ejemplo ms complejo

fromdjangoimportforms fromdjango.forms.widgetsimportTextarea classContactoForm(forms.Form): asunto=models.CharField() email=models.EmailField() edad=models.IntegerField(min_value=0) cuerpo=models.CharField(required=False, widget=Textarea())

49

Introduccin a Django

Otros componentes

Middlewares

Hooks situados entre tu web y el navegador Ejemplos

Cambio de idioma segn lenguaje navegador Ofuscacin 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

Introduccin a Django

Otros componentes

Autenticacin/autorizacin

Contiene:

Usuarios, grupos y permisos Controladores de acceso ... http://docs.djangoproject.com/en/dev/topics/auth/

I18N

Librera para automatizar

Cambio de idioma Regeneracin de catlogos ... http://docs.djangoproject.com/en/dev/topics/i18n/


51

Introduccin a Django

Otros componentes

Serializacin

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 aplicacin puede usar mismo sistema

http://docs.djangoproject.com/en/dev/topics/testing/
52

Introduccin a Django

An ms componentes

Sesiones Seales Interfaz de administracin Sindicacin RSS/Atom Vistas genricas


53

http://docs.djangoproject.com/en/dev/topics/http/sessions/

http://docs.djangoproject.com/en/dev/topics/signals/

http://docs.djangoproject.com/en/dev/ref/contrib/admin/

http://docs.djangoproject.com/en/dev/ref/contrib/syndication/

http://docs.djangoproject.com/en/dev/ref/generic-views/

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

54

Demo de desarrollo en Django

DEMO

55

ndice de contenidos
1. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

56

Django by example

Ejemplo a analizar: Web de Yaco


http://www.yaco.es/ Desarrollada 100% en Django Funcionalidades a mostrar


Implementacin general Agregacin RSS Editor inline Middleware Cach Cdigo Django resultante Resultado final

Anlisis

57

Django by example

Pgina 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. 2. 3. 4. 5. 6. 7. 8.

Introduccin a metodologas giles Qu pedir a un framework web? Es J2EE gil? Python, ejemplo de lenguage gil Introduccin a Django Demo, desarrollo en Django Django by example Reflexiones finales

61

Reflexiones finales

Reflexiones finales

Es necesario replantearse el proceso de desarrollo de aplicaciones web? J2EE es siempre una buena eleccin para el desarrollo web? Son los entornos comerciales realmente tan productivos como prometen sus fabricantes? Algn da veremos el lmite de posibilidades que trae Django?
62

Dudas? Sugerencias?

Gracias por la atencin!

63

You might also like