El
framework
web
defini1vo

                Ander
Beaskoetxea

                 abeaskoetxea@gmail.com

                   ...
Índice
• Frameworks
web
• Django
   • FilosoGa
   • Caracterís1cas
   • Rendimiento
• Conclusiones
y
Preguntas
Frameworks
web
Django:
Filoso6a
• Bajo
acoplamiento:
Paradigma
MVC
• Mínima
can1dad
de
código
• Desarrollo
ágil
• Don’t
Repeat
Yourself
(...
Django:
Caracterís:cas
• Mapeador
Objeto‐Relacional
(M)
• URLs
y
Vistas
(C)
• Sistema
de
Templates
(V)
• Formularios
• Int...
Django:
Esquema
Global
Mapeador
O‐R
Definición
modelo
(DDL):



class Fabricante(models.Model):


   nombre = models.CharField(blank=False, max_le...
Mapeador
O‐R
Manipulación
modelo
(DML):

 •   SELECT
de
1
registro:

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



 •   SELECT
de
N
r...
Mapeador
O‐R
Manipulación
modelo
(DML):

                               •
 •                                 UPDATE:
     ...
Django:
Esquema
Interno




•                    •                      •
    Modelo
=
Model       Vista
=
Template       ...
URLs
y
Vistas
• El
fichero
urls.py
actúa
como
puerta
de
entrada
para

   las
pe1ciones
HTTP

• Se
definen
URLs
elegantes
med...
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:
  • ...
Sistema
de
Templates
• Se
centran
exclusivamente
en
la
visualización

• Son
ficheros
.html
con
e1quetas
especiales
de
Djang...
Sistema
de
Templates
                       Ejemplo
básico
<html>
<head>
   <title>Ficha de fabricante</title>
</head>
<bo...
Sistema
de
Templates
       Ejemplo
básico
Sistema
de
Templates
             Herencia
de
templates
  <html>
  <head>
     <title>{% block titulo %}Mi web{% endblock ...
Sistema
de
Templates
             Herencia
de
templates
  {% extends quot;base.htmlquot; %}

  {% block titulo %}Mi blog{%...
Sistema
de
Templates
                               Filtros

• Permiten
trabajar
sobre
los
datos
recibidos
  {{ nombre|def...
Formularios
• Facilitan
enormemente
la
creación
de
formularios
• Intervienen
tres
1pos
de
clases
fundamentales:
    • Widg...
Formularios
• Paso
1/3:
Creación
de
la
clase
formulario
  from django import forms

  class ContactForm(forms.Form):
     ...
Formularios
• Paso
2/3:
Programación
de
la
view
asociada
  def contactar(request):
      if request.method == 'POST':
    ...
Formularios
• Paso
3/3:
Inclusión
en
la
template
  <form action=quot;/contactar/quot; method=quot;POSTquot;>
     {{ form....
Formularios
• Alterna1va:
Formularios
a
par1r
del
modelo
  from django.db import models
  from django.forms import ModelFo...
Internacionalización
• Ofrece
integración
con
la
librería
GNU
geVext
de
i18n
   • Un
fichero
.pot
con1ene
todos
los
strings...
Internacionalización
• ¿Cómo
indicar
qué
strings
deben
ser
traducidos?
   from django.utils.translation import ugettext as...
django.contrib.auth
• Ofrece
un
sistema
de
auten1cación
prefabricado
                       Modelo
django.contrib.auth
         Vista                                Controlador
Templates                     Views         ...
django.contrib.admin
• Genera
una
aplicación
ABM
sobre
un
modelo
de
datos
   1. Añadir
la
aplicación
al
fichero
seYngs.py
 ...
Django:
Rendimiento


                                  Compara:va
 [1]




[1]
Alrond’s
technoblog,
2007
|
hfp://www.alro...
Django:
Rendimiento
                            Velocidad
(Pe1ciones/seg)
CodeIgniter
(PHP)
                              ...
Django:
Rendimiento
                            Memoria
Virtual
consumida
(KB)
CodeIgniter
(PHP)
                         ...
Django:
Rendimiento
                            Memoria
Real
consumida
(KB)
CodeIgniter
(PHP)
                            ...
Django:
Rendimiento
                            Consumo
CPU
(%)
CodeIgniter
(PHP)
                                        ...
Django:
Rendimiento
                            Tiempo
de
Respuesta
(seg)
CodeIgniter
(PHP)
                              ...
Conclusiones

 ¿hacen
falta...?

       :‐)
Preguntas



   ?
Upcoming SlideShare
Loading in …5
×

Django: el framework web definitivo

3,005 views

Published on

Charla de Introducción a Django presentada con Ander Beaskoetxea en la Universidad de Deusto.

Published in: Technology, Business
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,005
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
101
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide




































  • 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 = Producto.objects.get(id=5) • SELECT
de
N
registros: ps1 = Producto.objects.filter(precio__gt=10.95) ps2 = Producto.objects.exclude(description__startswith=’d’) ps3 = ps1.order_by(‘-fecha_alta’, ‘fabricante’)
    9. 9. Mapeador
O‐R Manipulación
modelo
(DML): • • UPDATE: INSERT: f = Fabricante.objects.get(...) f = Fabricante() f.email = “support@apple.com” f.nombre = “Apple Inc.” f.save() f.email = “steve@apple.com” f.save() • DELETE: f = Fabricante.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 = Fabricante.objects.get(id=fabricante_id) ps = Producto.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 ?

    ×