django: el framework web definitivo

36
El framework web defini1vo Ander Beaskoetxea [email protected] Jaime Irurzun [email protected] abril 2009

Upload: ander-beaskoetxea

Post on 14-Jun-2015

5.296 views

Category:

Technology


2 download

DESCRIPTION

Charla de Introducción a Django presentada con Jaime Irurzun en la Universidad de Deusto.

TRANSCRIPT

Page 2: Django: el framework web definitivo

Índice

•Frameworksweb

•Django

•FilosoGa

•Caracterís1cas

•Rendimiento

•ConclusionesyPreguntas

Page 3: Django: el framework web definitivo

Frameworksweb

Page 4: Django: el framework web definitivo

Django:Filoso6a

•Bajoacoplamiento:ParadigmaMVC

•Mínimacan1daddecódigo

•Desarrolloágil

•Don’tRepeatYourself(DRY)

•Explícitofrenteaimplícito

•Consistencia

Page 5: Django: el framework web definitivo

Django:Caracterís:cas

• MapeadorObjeto‐Relacional(M)

• URLsyVistas(C)

• SistemadeTemplates(V)

• Formularios

• Internacionalización

• Auten1cación[django.contrib.auth]

• Administración[django.contrib.admin]

Page 6: Django: el framework web definitivo

Django:EsquemaGlobal

Page 7: Django: el framework web definitivo

MapeadorO‐R

class Fabricante(models.Model):

nombre = models.CharField(blank=False, max_length=40) email = models.EmailField()

class Producto(models.Model):

descripcion = models.CharField(blank=False, max_length=100) fecha_alta = models.DateTimeField(blank=True, default=datetime.now) precio = models.DecimalField(max_digits=4, decimal_places=2) fabricante = models.ForeignKey(Fabricante)

Definiciónmodelo(DDL):

Page 8: Django: el framework web definitivo

MapeadorO‐RManipulaciónmodelo(DML):

• SELECTde1registro:

p = Productos.objects.get(id=5)

• SELECTdeNregistros:

ps1 = Productos.objects.filter(precio__gt=10.95)

ps2 = Productos.objects.exclude(description__startswith=’d’)

ps3 = ps1.order_by(‘-fecha_alta’, ‘fabricante’)

Page 9: Django: el framework web definitivo

MapeadorO‐RManipulaciónmodelo(DML):

• INSERT:

f = Fabricante()

f.nombre = “Apple Inc.”

f.email = “[email protected]

f.save()

• UPDATE:

f = Fabricantes.objects.get(...)

f.email = “[email protected]

f.save()

• DELETE:

f = Fabricantes.objects.get(...)

f.delete()

Page 10: Django: el framework web definitivo

Django:EsquemaInterno

• Modelo=Model • Vista=Template • Controlador=View

Page 11: Django: el framework web definitivo

URLsyVistas

• Elficherourls.pyactúacomopuertadeentradaparalaspe1cionesHTTP

• SedefinenURLselegantesmedianteexpresionesregularesqueredirigenafuncionesdeviews.py

• Cadaexpresiónregulardelegaenunavista:

• Pe1ción:hfp://dominio.com/fabricante/4

• (r'^fabricante/(.*)/?$', 'dominio.app.views.ficha_fabr')

Page 12: Django: el framework web definitivo

URLsyVistas

• Lafuncióndeviews.pyrecibeunobjetoespecialconlape1ciónytodoslosparámetrosdelaURL:

• Pe1ción:hfp://dominio.com/fabricante/4

• (r'^fabricante/(.*)/?$', 'dominio.app.views.ficha_fabr')

def ficha_fabr(request, fabricante_id):

f = Fabricantes.objects.get(id=fabricante_id) ps = Productos.objects.filter(fabricante=f) return render_to_response(‘fabr.html’, {‘fabricante’: f, ‘productos’: ps})

Page 13: Django: el framework web definitivo

SistemadeTemplates

• Secentranexclusivamenteenlavisualización

• Sonficheros.htmlcone1quetasespecialesdeDjango:

{{ variable }}

{% if ... %} {% else %} {% if ... %}

{% else %}

{% endif %}

{% for ... in ... %}

{% empty %}

{% endfor %}

Page 14: Django: el framework web definitivo

SistemadeTemplates

<html><head> <title>Ficha de fabricante</title></head><body> <h1>{{fabricante.nombre }}</h1> Productos fabricados:<br /><br /> <table> <th><td>Descripción</td><td>Precio</td></th> {% for p in productos %} <tr> <td>{{ p.descripcion }}</td> <td>{{ p.precio }}</td> </tr> {% endfor %} </table></body></html>

Ejemplobásico

Page 15: Django: el framework web definitivo

SistemadeTemplatesEjemplobásico

Page 16: Django: el framework web definitivo

SistemadeTemplatesHerenciadetemplates

<html><head> <title>{% block titulo %}Mi web{% endblock %}</title></head><body> <div id="menu"> {% block menu %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="contenido"> {% block contenido %}{% endblock %} </div></body></html>

Page 17: Django: el framework web definitivo

SistemadeTemplatesHerenciadetemplates

{% extends "base.html" %}

{% block titulo %}Mi blog{% endblock %}

{% block contenido %}

...

{% endblock %}

Page 18: Django: el framework web definitivo

SistemadeTemplatesFiltros

• Permitentrabajarsobrelosdatosrecibidos

{{ nombre|default:"<sin nombre>" }}

{{ productos|length }}

{{ comentario|striptags }}

• Posibilidaddecrearfiltrospropios

Page 19: Django: el framework web definitivo

Formularios• Facilitanenormementelacreacióndeformularios

• Intervienentres1posdeclasesfundamentales:

• Widget:ComponentevisualdeHTML

• Field:RestriccionesasociadasaunWidget

• Form:ConjuntodeFieldsdeunformulario

TextInput => <input type=”text”...>CheckboxInput => <input type=”checkbox”...>

EmailFieldIPAddressField

widget, label, initial, error, ...

ContactForm (nombre, email, telefono, mensaje, ...)

Page 20: Django: el framework web definitivo

Formularios

from django import forms

class ContactForm(forms.Form): asunto = forms.CharField(max_length=100) mensaje = forms.CharField() remitente = forms.EmailField()

• Paso1/3:Creacióndelaclaseformulario

Page 21: Django: el framework web definitivo

Formularios

def contactar(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): # ... return HttpResponseRedirect('/gracias/') else: form = ContactForm()

return render_to_response('contactar.html', {'form': form, ...})

• Paso2/3:Programacióndelaviewasociada

Page 22: Django: el framework web definitivo

Formularios

<form action="/contactar/" method="POST"> {{ form.asunto.errors }} <label for="id_asunto">Asunto:</label> {{ form.asunto }}

{{ form.mensaje.errors }} <label for="id_ mensaje">Mensaje:</label> {{ form.mensaje }}

{{ form.remitente.errors }} <label for="id_remitente">Tu email:</label> {{ form.remitente }}

<input type="submit" value="Enviar" /></form>

• Paso3/3:Inclusiónenlatemplate

Page 23: Django: el framework web definitivo

Formularios

from django.db import modelsfrom django.forms import ModelForm

class Contacto(models.Model): nombre = models.CharField(max_length=100) email = models.EmailField() password = models.PasswordField() ...

class ContactoParcialForm(ModelForm): class Meta: model = Contacto fields = ('nombre', 'email')

• Alterna1va:Formulariosapar1rdelmodelo

Page 24: Django: el framework web definitivo

Internacionalización

• OfreceintegraciónconlalibreríaGNUgeVextdei18n

• Unfichero.potcon1enetodoslosstringsusados

contabilidad.pot

• Encadafichero.poseguardaunatraducción

es_ES.potes_AR.poten_GB.pot

• Cada.posecompilaygeneraun.mobinario

es_ES.moes_AR.moen_GB.mo

Page 25: Django: el framework web definitivo

Internacionalización

from django.utils.translation import ugettext as _

print _(“Cadena de texto”)

• ¿Cómoindicarquéstringsdebensertraducidos?

from django.utils.translation import ungettext

frase = ungettext(“Hay %(total)d resultado”, “Hay %(total)d resultados”, total) % { ‘total’: total }

• Ges1óncómodadesingularesyplurales

Page 26: Django: el framework web definitivo

django.contrib.auth

Modelo

• Ofreceunsistemadeauten1caciónprefabricado

Page 27: Django: el framework web definitivo

django.contrib.authVista Controlador

Templatesregistra1on_form.htmlregistra1on_complete.htmlac1vate.html

Viewslogin()logout()logout_then_login()password_change()password_change_done()password_reset()password_reset_done()redirect_to_login()password_reset_confirm()password_reset_complete()

FormulariosAdminPasswordChangeFormAuthen1ca1onFormPasswordChangeFormPasswordResetFormUserCrea1onForm

Page 28: Django: el framework web definitivo

django.contrib.admin• GeneraunaaplicaciónABMsobreunmodelodedatos

1. AñadirlaaplicaciónalficheroseYngs.py

2. Añadirlaurldeaccesoalficherourls.py

INSTALLED_APPS = ( ... 'django.contrib.admin',)

from django.contrib import adminadmin.autodiscover()

urlpatterns += patterns(‘’, ... (r'^admin/(.*)', admin.site.root),)

Page 29: Django: el framework web definitivo

Django:Rendimiento

Compara:va[1]

[1]Alrond’stechnoblog,2007|hfp://www.alrond.com/en/2007/jan/25/performance‐test‐of‐6‐leading‐frameworks/

Page 30: Django: el framework web definitivo

Django:RendimientoVelocidad(Pe1ciones/seg)

0

275

550

825

1100CodeIgniter(PHP)Catalyst(Perl)Django(hilos)Django(hilos)+PsycoDjango(procesos)Django(procesos)+PsycoRubyOnRails1.1.6RubyOnRails1.2.1Symphony(PHP)TurboGears(Python)

Page 31: Django: el framework web definitivo

Django:RendimientoMemoriaVirtualconsumida(KB)

0

75000

150000

225000

300000CodeIgniter(PHP)Catalyst(Perl)Django(hilos)Django(hilos)+PsycoDjango(procesos)Django(procesos)+PsycoRubyOnRails1.1.6RubyOnRails1.2.1Symphony(PHP)TurboGears(Python)

Page 32: Django: el framework web definitivo

Django:RendimientoMemoriaRealconsumida(KB)

0

50000

100000

150000

200000CodeIgniter(PHP)Catalyst(Perl)Django(hilos)Django(hilos)+PsycoDjango(procesos)Django(procesos)+PsycoRubyOnRails1.1.6RubyOnRails1.2.1Symphony(PHP)TurboGears(Python)

Page 33: Django: el framework web definitivo

Django:RendimientoConsumoCPU(%)

0

15

30

45

60CodeIgniter(PHP)Catalyst(Perl)Django(hilos)Django(hilos)+PsycoDjango(procesos)Django(procesos)+PsycoRubyOnRails1.1.6RubyOnRails1.2.1Symphony(PHP)TurboGears(Python)

Page 34: Django: el framework web definitivo

Django:RendimientoTiempodeRespuesta(seg)

0

1,25

2,5

3,75

5CodeIgniter(PHP)Catalyst(Perl)Django(hilos)Django(hilos)+PsycoDjango(procesos)Django(procesos)+PsycoRubyOnRails1.1.6RubyOnRails1.2.1Symphony(PHP)TurboGears(Python)

Page 35: Django: el framework web definitivo

Conclusiones

¿hacenfalta...?

:‐)

Page 36: Django: el framework web definitivo

Preguntas

?