Django: el framework web definitivo

6,037 views

Published on

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

Published in: Technology, Business
  • Be the first to comment

Django: el framework web definitivo

  1. 1. El
framework
web
defini1vo Ander
Beaskoetxea
 abeaskoetxea@gmail.com Jaime
Irurzun abril
2009 jaime.irurzun@gmail.com
  2. 2. Índice • Frameworks
web • Django • FilosoGa • Caracterís1cas • Rendimiento • Conclusiones
y
Preguntas
  3. 3. Frameworks
web
  4. 4. Django:
Filoso6a • Bajo
acoplamiento:
Paradigma
MVC • Mínima
can1dad
de
código • Desarrollo
ágil • Don’t
Repeat
Yourself
(DRY) • Explícito
frente
a
implícito • Consistencia
  5. 5. Django:
Caracterís:cas • Mapeador
Objeto‐Relacional
(M) • URLs
y
Vistas
(C) • Sistema
de
Templates
(V) • Formularios • Internacionalización • Auten1cación
[django.contrib.auth] • Administración
[django.contrib.admin]
  6. 6. Django:
Esquema
Global
  7. 7. Mapeador
O‐R Definición
modelo
(DDL): 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)
  8. 8. Mapeador
O‐R Manipulación
modelo
(DML): • SELECT
de
1
registro: p = Productos.objects.get(id=5) • SELECT
de
N
registros: ps1 = Productos.objects.filter(precio__gt=10.95) ps2 = Productos.objects.exclude(description__startswith=’d’) ps3 = ps1.order_by(‘-fecha_alta’, ‘fabricante’)
  9. 9. Mapeador
O‐R Manipulación
modelo
(DML): • • UPDATE: INSERT: f = Fabricantes.objects.get(...) f = Fabricante() f.email = “support@apple.com” f.nombre = “Apple Inc.” f.save() f.email = “steve@apple.com” f.save() • DELETE: f = Fabricantes.objects.get(...) f.delete()
  10. 10. Django:
Esquema
Interno • • • Modelo
=
Model Vista
=
Template Controlador
=
View
  11. 11. URLs
y
Vistas • El
fichero
urls.py
actúa
como
puerta
de
entrada
para
 las
pe1ciones
HTTP • Se
definen
URLs
elegantes
mediante
expresiones
 regulares
que
redirigen
a
funciones
de
views.py • Cada
expresión
regular
delega
en
una
vista: • Pe1ción:
hfp://dominio.com/fabricante/4 • (r'^fabricante/(.*)/?$', 'dominio.app.views.ficha_fabr')
  12. 12. URLs
y
Vistas • La
función
de
views.py
recibe
un
objeto
especial
con
 la
pe1ción
y
todos
los
parámetros
de
la
URL: • 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})
  13. 13. Sistema
de
Templates • Se
centran
exclusivamente
en
la
visualización
 • Son
ficheros
.html
con
e1quetas
especiales
de
Django: {% if ... %} {% for ... in ... %} {% else %} {% if ... %} {{ variable }} {% empty %} {% else %} {% endfor %} {% endif %}
  14. 14. Sistema
de
Templates Ejemplo
básico <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>
  15. 15. Sistema
de
Templates Ejemplo
básico
  16. 16. Sistema
de
Templates Herencia
de
templates <html> <head> <title>{% block titulo %}Mi web{% endblock %}</title> </head> <body> <div id=quot;menuquot;> {% block menu %} <ul> <li><a href=quot;/quot;>Home</a></li> <li><a href=quot;/blog/quot;>Blog</a></li> </ul> {% endblock %} </div> <div id=quot;contenidoquot;> {% block contenido %}{% endblock %} </div> </body> </html>
  17. 17. Sistema
de
Templates Herencia
de
templates {% extends quot;base.htmlquot; %} {% block titulo %}Mi blog{% endblock %} {% block contenido %} ... {% endblock %}
  18. 18. Sistema
de
Templates Filtros • Permiten
trabajar
sobre
los
datos
recibidos {{ nombre|default:quot;<sin nombre>quot; }} {{ productos|length }} {{ comentario|striptags }} • Posibilidad
de
crear
filtros
propios
  19. 19. Formularios • Facilitan
enormemente
la
creación
de
formularios • Intervienen
tres
1pos
de
clases
fundamentales: • Widget:
Componente
visual
de
HTML TextInput => <input type=”text”...> CheckboxInput => <input type=”checkbox”...> • Field:
Restricciones
asociadas
a
un
Widget EmailField widget, label, initial, error, ... IPAddressField • Form:
Conjunto
de
Fields
de
un
formulario ContactForm (nombre, email, telefono, mensaje, ...)
  20. 20. Formularios • Paso
1/3:
Creación
de
la
clase
formulario from django import forms class ContactForm(forms.Form): asunto = forms.CharField(max_length=100) mensaje = forms.CharField() remitente = forms.EmailField()
  21. 21. Formularios • Paso
2/3:
Programación
de
la
view
asociada 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, ...})
  22. 22. Formularios • Paso
3/3:
Inclusión
en
la
template <form action=quot;/contactar/quot; method=quot;POSTquot;> {{ form.asunto.errors }} <label for=quot;id_asuntoquot;>Asunto:</label> {{ form.asunto }} {{ form.mensaje.errors }} <label for=quot;id_ mensajequot;>Mensaje:</label> {{ form.mensaje }} {{ form.remitente.errors }} <label for=quot;id_remitentequot;>Tu email:</label> {{ form.remitente }} <input type=quot;submitquot; value=quot;Enviarquot; /> </form>
  23. 23. Formularios • Alterna1va:
Formularios
a
par1r
del
modelo from django.db import models from 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')
  24. 24. Internacionalización • Ofrece
integración
con
la
librería
GNU
geVext
de
i18n • Un
fichero
.pot
con1ene
todos
los
strings
usados contabilidad.pot • En
cada
fichero
.po
se
guarda
una
traducción es_ES.pot


es_AR.pot


en_GB.pot • Cada
.po
se
compila
y
genera
un
.mo
binario es_ES.mo


es_AR.mo


en_GB.mo
  25. 25. Internacionalización • ¿Cómo
indicar
qué
strings
deben
ser
traducidos? from django.utils.translation import ugettext as _ print _(“Cadena de texto”) • Ges1ón
cómoda
de
singulares
y
plurales from django.utils.translation import ungettext frase = ungettext(“Hay %(total)d resultado”, “Hay %(total)d resultados”, total) % { ‘total’: total }
  26. 26. django.contrib.auth • Ofrece
un
sistema
de
auten1cación
prefabricado Modelo
  27. 27. django.contrib.auth Vista Controlador Templates Views Formularios registra1on_form.html login() AdminPasswordChangeForm registra1on_complete.html logout() Authen1ca1onForm ac1vate.html logout_then_login() PasswordChangeForm password_change() PasswordResetForm password_change_done() UserCrea1onForm password_reset() password_reset_done() redirect_to_login() password_reset_confirm() password_reset_complete()
  28. 28. django.contrib.admin • Genera
una
aplicación
ABM
sobre
un
modelo
de
datos 1. Añadir
la
aplicación
al
fichero
seYngs.py INSTALLED_APPS = ( ... 'django.contrib.admin', ) 2. Añadir
la
url
de
acceso
al
fichero
urls.py from django.contrib import admin admin.autodiscover() urlpatterns += patterns(‘’, ... (r'^admin/(.*)', admin.site.root), )
  29. 29. Django:
Rendimiento Compara:va
 [1] [1]
Alrond’s
technoblog,
2007
|
hfp://www.alrond.com/en/2007/jan/25/performance‐test‐of‐6‐leading‐frameworks/
  30. 30. Django:
Rendimiento Velocidad
(Pe1ciones/seg) CodeIgniter
(PHP) 1100 Catalyst
(Perl) Django
(hilos) Django
(hilos)
+
Psyco Django
(procesos) Django
(procesos)
+
Psyco 825 RubyOnRails
1.1.6 RubyOnRails
1.2.1 Symphony
(PHP) TurboGears
(Python) 550 275 0
  31. 31. Django:
Rendimiento Memoria
Virtual
consumida
(KB) CodeIgniter
(PHP) 300000 Catalyst
(Perl) Django
(hilos) Django
(hilos)
+
Psyco Django
(procesos) Django
(procesos)
+
Psyco 225000 RubyOnRails
1.1.6 RubyOnRails
1.2.1 Symphony
(PHP) TurboGears
(Python) 150000 75000 0
  32. 32. Django:
Rendimiento Memoria
Real
consumida
(KB) CodeIgniter
(PHP) 200000 Catalyst
(Perl) Django
(hilos) Django
(hilos)
+
Psyco Django
(procesos) Django
(procesos)
+
Psyco 150000 RubyOnRails
1.1.6 RubyOnRails
1.2.1 Symphony
(PHP) TurboGears
(Python) 100000 50000 0
  33. 33. Django:
Rendimiento Consumo
CPU
(%) CodeIgniter
(PHP) 60 Catalyst
(Perl) Django
(hilos) Django
(hilos)
+
Psyco Django
(procesos) Django
(procesos)
+
Psyco 45 RubyOnRails
1.1.6 RubyOnRails
1.2.1 Symphony
(PHP) TurboGears
(Python) 30 15 0
  34. 34. Django:
Rendimiento Tiempo
de
Respuesta
(seg) CodeIgniter
(PHP) 5 Catalyst
(Perl) Django
(hilos) Django
(hilos)
+
Psyco Django
(procesos) Django
(procesos)
+
Psyco 3,75 RubyOnRails
1.1.6 RubyOnRails
1.2.1 Symphony
(PHP) TurboGears
(Python) 2,5 1,25 0
  35. 35. Conclusiones ¿hacen
falta...? :‐)
  36. 36. Preguntas ?

×