Your SlideShare is downloading. ×
0
Desarrollo	  web	  ágil	  con	              Python	  y	  DjangoJorge	  Bas7da	  Pérez        Jaime	  Irurzun	  Graña	   ne...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
• Legible                Sintaxis	  intuiHva	  y	  estricta• Produc/vo              Entre	  1/3	  y	  1/5	  más	  conciso	...
Instalación $ sudo apt-get install pythonhttp://www.python.org/download/Snow	  Leopard	  incluye	  las	  versiones	  2.5.4...
El	  Intérprete
El	  Intérprete                        Modo	  Batch    holamundo.py                                $ python holamundo.py#!...
El	  Intérprete                           Modo	  Batch     holamundo.py                                      $ python hola...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Tipos	  de	  datosobject         +	  info:	  hMp://docs.python.org/library/stdtypes.html
Tipos	  de	  datos          int     1234         long     35L        float    3.1415object         +	  info:	  hMp://docs.p...
Tipos	  de	  datos          int     1234         long     35L        float    3.1415         bool     True       Falseobjec...
Tipos	  de	  datos          int     1234         long     35L        float    3.1415         bool     True       False     ...
Tipos	  de	  datos          int     1234         long     35L        float    3.1415         bool     True       False     ...
Tipos	  de	  datos          int     1234         long     35L        float    3.1415         bool     True       False     ...
Tipos	  de	  datos           int     1234         long     35L        float    3.1415         bool      True       False   ...
Tipos	  de	  datos                                          o	                                                            ...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Operadores+	  info:	  hMp://docs.python.org/library/operator.html
Operadores                a + b         a - b        a * b         a / bnuméricos                a % b          -a        ...
Operadores                  a + b         a - b        a * b         a / b  numéricos                  a % b          -a  ...
Operadores                  a + b         a - b        a * b          a / b  numéricos                  a % b          -a ...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Usos	  frecuentes:	  list
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]>>> ...
Usos	  frecuentes:	  str
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP n...
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP n...
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP n...
Usos	  frecuentes:	  dict
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] ...
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] ...
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] ...
Usos	  frecuentes:	  str	  %
Usos	  frecuentes:	  str	  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio
Usos	  frecuentes:	  str	  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hyc...
Usos	  frecuentes:	  str	  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hyc...
Módulossound/      __init__.py            1. Un	  módulo	  es	  un	  fichero	  .py      formats/              __init__.py  ...
Módulossound/ 2    __init__.py             1. Un	  módulo	  es	  un	  fichero	  .py      formats/              __init__.py ...
Módulos           import math           ¿Dónde	  los	  busca	  Python?En	  la	  lista	  de	  directorios	  que	  conHene	 ...
Módulossound/                       import sound.effects.echo      __init__.py            sound.effects.echo.echofilter(.....
Módulossound/                       import sound.effects.echo      __init__.py            sound.effects.echo.echofilter(.....
Módulossound/                       import sound.effects.echo      __init__.py            sound.effects.echo.echofilter(.....
Módulossound/                       import sound.effects.echo      __init__.py            sound.effects.echo.echofilter(.....
Módulossound/                       import sound.effects.echo      __init__.py            sound.effects.echo.echofilter(.....
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Estructuras {}
Estructuras {}
Identación>>> from __future__ import braces     File "<stdin>", line 1     SyntaxError: not a chance
Identación>>> from __future__ import braces     File "<stdin>", line 1     SyntaxError: not a chance                      ...
¿PEP	  8?                                                                 PEP 8•	  Guido	  van	  Rossum	  (2001)•	  Recome...
Funcionesdef my_first_function(p1, p2):    return "Hello World!"
Funciones1   def my_first_function(p1, p2):        return "Hello World!"
Funciones                            21   def my_first_function(p1, p2):        return "Hello World!"
Funciones                            21   def my_first_function(p1, p2):      3 return "Hello World!"
Funciones                                                 21   def my_first_function(p1, p2):      3 return "Hello World!"...
Conversión	  de	  /pos +info:	  hMp://docs.python.org/library/func7ons.html
Conversión	  de	  /pos>>> int(1.3)1 +info:	  hMp://docs.python.org/library/func7ons.html
Conversión	  de	  /pos>>> int(1.3)1>>> str(2)2 +info:	  hMp://docs.python.org/library/func7ons.html
Conversión	  de	  /pos>>> int(1.3)1>>> str(2)2>>> float(1)1.0 +info:	  hMp://docs.python.org/library/func7ons.html
Conversión	  de	  /pos>>> int(1.3)1                             >>> tuple([1,2,3])                             (1, 2, 3)>>...
Conversión	  de	  /pos>>> int(1.3)1                             >>> tuple([1,2,3])                             (1, 2, 3)>>...
Funciones	  comunes +info:	  hMp://docs.python.org/library/func7ons.html
Funciones	  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4      +info:	  hMp://docs.python.org/library/func7ons.html
Funciones	  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4>>>   range(5)[0,   1, 2, 3, 4]>>>   range(1,7)[1,   2, 3, 4...
Funciones	  comunes                                       >>> type(True)>>> len("Python Mola")                            ...
Funciones	  comunes                                       >>> type(True)>>> len("Python Mola")                            ...
Funciones	  interesantes             Son	  sólo	  un	  ejemplo...  +info:	  hMp://docs.python.org/library/func7ons.html
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]                    Son	  sólo	 ...
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2])[1, 2, 3,...
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]                            >>> round(1.2345,2)>>> zip(a,b)         ...
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]                            >>> round(1.2345,2)>>> zip(a,b)         ...
Funciones	  de	  ayuda
Funciones	  de	  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, _...
Funciones	  de	  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, _...
Clasesclass Student(object):    def __init__(self, name, age):        self.name = name        self.age = age    def hello(...
Clases    1class Student(object):    def __init__(self, name, age):        self.name = name        self.age = age    def h...
Clases    1              2class Student(object):    def __init__(self, name, age):        self.name = name        self.age...
Clases    1              2class Student(object):  3 def __init__(self, name, age):        self.name = name        self.age...
Clases    1              2class Student(object):  3 def __init__(self, name, age):      4 self.name = name        self.age...
Clases    1              2class Student(object):  3 def __init__(self, name, age):      4 self.name = name        self.age...
Clases    1              2class Student(object):  3 def __init__(self, name, age):      4 self.name = name        self.age...
El	  operador	  ()• Es	  importante	  diferenciar:    funcion	  	  	  vs	  	  	  funcion()    Clase	  	  	  	  	  	  	  vs...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Sentencias:	  if-­‐else$name = "Jon";               name = "Jon"if($name == "Jon"){          if name == "Jon":    $name = ...
Sentencias:	  while       $count = 0;       while ($count < 5) {           echo "Number ".$count;           $count+=1;    ...
Sentencias:	  for      for ($i=0; $i < 5; $i++) {          echo "Number ".$count;      }      for i in range(4):          ...
Sentencias:	  try-­‐except           try {               $result = 3 / 0;           } catch (Exception $e) {              ...
Prueba	  de	  sentencias	  en	  consola
Conclusiones•	  Python	  es	  un	  lenguaje	  fácil	  de	  aprender.•	  Menos	  código:    •	  Muchos	  Muchísimos	  menos...
Conclusiones•	  Python	  es	  un	  lenguaje	  fácil	  de	  aprender.•	  Menos	  código:    •	  Muchos	  Muchísimos	  menos...
Ejemplo	  &	  Ejercicio
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Evolución	  de	  la	  Web                   Desarrollo	  Web1ª	  Generación    2ª	  Generación   3ª	  Generación    HTML  ...
Frameworks	  web
Django:	  Qué	  y	  dónde
FilosoXa•	  Loose	  coupling,	  	  Acoplamiento	  débil.    •	  Cada	  capa	  es	  independiente	  y	  desconoce	  complet...
FilosoXa•	  Loose	  coupling,	  	  Acoplamiento	  débil.    •	  Cada	  capa	  es	  independiente	  y	  desconoce	  complet...
FilosoXa•	  Explicit	  is	  beger	  than	  implicit.    •	  Este	  es	  un	  principio	  de	  Python.    •	  Django	  no	 ...
La	  comunidad
La	  comunidad• django-­‐users        18.000	  miembros
La	  comunidad• django-­‐users        18.000	  miembros• django-­‐developers        5.900	  miembros
La	  comunidad• django-­‐users        18.000	  miembros• django-­‐developers        5.900	  miembros• djangoproject.com   ...
¿Quién	  usa	  Django?
¿Quién	  usa	  Django?           etc...
1.	  Instalación	  Python     $ sudo apt-get install python   http://www.python.org/download/    Snow	  Leopard	  incluye	...
2.	  Instalación	  SGBDConfigurar	  un	  motor	  de	  Base	  de	  Datos:  •	  Oficiales:	                           •	  Comu...
2.	  Instalación	  SGBDConfigurar	  un	  motor	  de	  Base	  de	  Datos:  •	  Oficiales:	                           •	  Comu...
2.	  Instalación	  SGBD•	  Vamos	  a	  uHlizar	  SQLite	  por	  comodidad•	  Desde	  Python	  2.5	  podemos	  uHlizar	  sq...
2.	  Instalación	  SGBD•	  Vamos	  a	  uHlizar	  SQLite	  por	  comodidad•	  Desde	  Python	  2.5	  podemos	  uHlizar	  sq...
3.	  Instalación	  DjangoA:	  Paquetes	  de	  cada	  distro   • apt-get install python-djangoB:	  Official	  Release   • hMp...
All	  Right?
All	  Right?>>> import django>>> django.VERSION(1, 2, 3, final, 0)>>> import djangoTraceback (most recent call last):  Fil...
Bienvenidos	  al	  mundo	  de	  Oz
Ficheros	  y	  Carpetas            ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?                 *	  Incluida	  la	...
Ficheros	  y	  Carpetas             ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?FicherosCarpetas                  ...
Ficheros	  y	  Carpetas                   ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?           Rails     Symfony...
Ficheros	  y	  Carpetas                   ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?           Rails     Symfony...
Ficheros	  y	  Carpetas                   ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?           Rails     Symfony...
Let’s	  enjoy
Crear	  nuestro	  proyecto                      de	  4	  ficheros	  ;-­‐)
Crear	  nuestro	  proyecto              de	  4	  ficheros	  ;-­‐)    $ django-admin startproject dwitter
Crear	  nuestro	  proyecto              de	  4	  ficheros	  ;-­‐)    $ django-admin startproject dwitter                  _...
Crear	  nuestro	  proyecto                                                               de	  4	  ficheros	  ;-­‐)         ...
Crear	  nuestro	  proyecto                                                               de	  4	  ficheros	  ;-­‐)         ...
sesngs.py
Arrancar	  nuestro	  proyecto                        de	  4	  ficheros	  ;-­‐)
Arrancar	  nuestro	  proyecto                          de	  4	  ficheros	  ;-­‐)     $ cd dwitter     $ python manage.py ru...
Arrancar	  nuestro	  proyecto                          de	  4	  ficheros	  ;-­‐)     $ cd dwitter     $ python manage.py ru...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
MVC	  en	  DjangoModelo	  =	  Model   Vista	  =	  Template   Controlador	  =	  URL+View
URLs	  y	  Vistas• El	  fichero	  urls.py	  actúa	  como	  puerta	  de	  entrada	  para	  las	     pe7ciones	  HTTP• Se	  d...
URLs	  y	  Vistas• La	  función	  de	  views.py	  recibe	  como	  parámetros	  un	  objeto	     HhpRequest	  y	  todos	  l...
URLs	  y	  Vistas Ejemplo	  1:	  	  http://mysite.com/time           from django.conf.urls.defaults import *           fro...
URLs	  y	  Vistas Ejemplo	  2:	  	  http://mysite.com/time/plus/2           from django.conf.urls.defaults import *       ...
URLs	  y	  Vistas Ejemplo	  2:	  	  http://mysite.com/time/plus/2           from django.conf.urls.defaults import *       ...
¡Recuerda!:	  MVC
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Templates• Separan	  la	  lógica	  de	  presentación	  a	  una	  capa	  independiente.     • Ficheros	  independientes	  (...
Templates • Se	  basan	  en	  dos	  7pos	  de	  objetos:	  Template()	  y	  Context().       • Un	  objeto	  Template()	  ...
Templates• Primera	  aproximación	  al	  obje7vo:	  Template	  +	  Context         from django.http import HttpResponse   ...
Templates• Segunda	  aproximación	  al	  obje7vo:	  open(),	  read(),	  close()      from django.http import HttpResponse ...
Templates• Segunda	  aproximación	  al	  obje7vo:	  open(),	  read(),	  close()      from django.http import HttpResponse ...
Templates• Segunda	  aproximación	  al	  obje7vo:	  open(),	  read(),	  close()      from django.http import HttpResponse ...
Templates• Tercera	  aproximación	  al	  obje7vo:	  get_template()                             TEMPLATE_DIRS = (     sesng...
Templates• Tercera	  aproximación	  al	  obje7vo:	  get_template()                             TEMPLATE_DIRS = (     sesng...
Templates• Tercera	  aproximación	  al	  obje7vo:	  get_template()                             TEMPLATE_DIRS = (     sesng...
Templates• Obje7vo	  alcanzado:	  render_to_response() from django.shortcuts import render_to_response from datetime impor...
Templates• Obje7vo	  alcanzado:	  render_to_response() from django.shortcuts import render_to_response from datetime impor...
Templates• Obje7vo	  alcanzado:	  render_to_response() from django.shortcuts import render_to_response from datetime impor...
Templates:	  Tip                  TEMPLATE_DIRS = (a) sesngs.py          /home/django/templates,                  )
Templates:	  Tip                  TEMPLATE_DIRS = (                                                  Reusa ble	  a) sesngs...
Templates:	  Tip                      TEMPLATE_DIRS = (                                                                   ...
a) Crear	  la	  app	  dwiger.website.b) Incluir	  la	  app	  en	  sesngs.py.c) Definir	  una	  vista	  para	  la	  URL	  “/...
Tarea	  1:	  URLs	  y	  Vistas a) Definir	  todas	  las	  URLs	  y	  vistas	  (vacías)	      que	  va	  a	  tener	  el	  pr...
Tarea	  1:	  URLs	  y	  Vistas b) Implementar	  la	  vista	  timeline()	  para	      que	  renderice	  un	  Hmeline	  de	 ...
Templates	  en	  detalle•	  Si,	  otro	  sistema	  de	  templates  •	  Smarty,	  Tiles,	  ClearSilver	  ...	  •Describen	 ...
FilosoXa	  y	  Limitaciones•	  La	  sintaxis	  debe	  estar	  desacoplada	  del	  HTML/XML.•	  Los	  diseñadores	  saben	 ...
Templates:	  {{}}<html>    <head>Ejemplo templates</head>    <body>        Hola, {{ username }}.    </body></html>     {us...
Filters	  y	  Tags
Filters	  y	  Tags
Filters	  y	  Tagsfilter   {{ varible|filter }}
Filters	  y	  Tags      filter     {{ varible|filter }}inline	  tag   {% tag var1 var2 %}
Filters	  y	  Tags      filter     {{ varible|filter }}inline	  tag   {% tag var1 var2 %}block	  tag    {% tag var1 %}     ...
Templates:	  tags	  {%	  %}
Templates:	  tags	  {%	  %}comment   {% comment %} Bu! {% endcomment %}
Templates:	  tags	  {%	  %}comment   {% comment %} Bu! {% endcomment %}    for   {% for elemento in lista %}              ...
Templates:	  tags	  {%	  %}comment    {% comment %} Bu! {% endcomment %}    for    {% for elemento in lista %}            ...
Tarea	  2:	  Tags a) UHlizar	  tags	  para	  que	  el	  Hmeline	  se	      muestre	  con	  el	  siguiente	  formato:  • <u...
Templates:	  Filters         <html>             <head>Ejemplo templates</head>/tle         <body>                 Hola, {{...
Templates:	  Filters
Templates:	  Filters            {username: Juan es majo}length   {{ username|length }}             12
Templates:	  Filters             {username: Juan es majo}length    {{ username|length }}                12 cut      {{ use...
Templates:	  Filters             {username: Juan es majo}length    {{ username|length }}                12 cut      {{ use...
Templates:	  Filters               {username: Juan es majo} length     {{ username|length }}                12   cut      ...
Templates:	  Filters               {username: Juan es majo} length     {{ username|length }}                12   cut      ...
Templates:	  Filters                  {username: Juan es majo} length       {{ username|length }}                   12   c...
Templates:	  Filters
Templates:	  Filters{username: Juan es <b>majo, guapo y <em>listo</em></b>}          striptags   {{ username|striptags }} ...
Templates:	  Filters  {username: Juan es <b>majo, guapo y <em>listo</em></b>}            striptags   {{ username|striptags...
Templates:	  Filters  {username: Juan es <b>majo, guapo y <em>listo</em></b>}            striptags   {{ username|striptags...
Templates:	  Filters
Templates:	  Filters{url: Visitad http://www.djangoproject.com}    urlize   {{ url|urlize }}                Visitad <a hre...
Templates:	  Filters{url: Visitad http://www.djangoproject.com}     urlize   {{ url|urlize }}                 Visitad <a h...
Templates:	  Filters{lista: [States, [Kansas, [Lawrence, Topeka], Illinois]]}
Templates:	  Filters{lista: [States, [Kansas, [Lawrence, Topeka], Illinois]]}  unordered_list      {{ lista|unordered_list...
Templates:	  Filters
Templates:	  Filters          {value: 123456789}add   {{ value|add:”1” }}        123456790
Templates:	  Filters                    {value: 123456789}     add        {{ value|add:”1” }}          123456790filesizefor...
Templates:	  Filters                       {value: 123456789}     add          {{ value|add:”1” }}           123456790files...
Templates:	  Filters                       {value: 123456789}     add          {{ value|add:”1” }}           123456790files...
Templates:	  Filters                       {value: 123456789}     add          {{ value|add:”1” }}           123456790files...
Tarea	  3:	  Filters a) Añadir	  a	  cada	  tweet	  del	  Hmeline	  el	      Hempo	  transcurrido:  • <username>:	  <tweet...
Tarea	  3:	  Filters b) Formatear	  las	  publicaciones	  de	      HOYGANs	  convirHendo	  el	  texto	  a	      minúsculas...
Tarea	  3:	  Filters c) Conseguir	  que	  todas	  las	  urls	  que	      aparezcan	  en	  los	  tweets	  se	  conviertan	 ...
Templates:	  tags	  {%	  %}
Templates:	  tags	  {%	  %}cycle   {% for elemento in lista %}            <li class="{% cycle rojo azul %}">{{ elemento }}...
Templates:	  tags	  {%	  %}  cycle   {% for elemento in lista %}              <li class="{% cycle rojo azul %}">{{ element...
Templates:	  tags	  {%	  %}  cycle   {% for elemento in lista %}              <li class="{% cycle rojo azul %}">{{ element...
Templates:	  tags	  {%	  %}  cycle   {% for elemento in lista %}              <li class="{% cycle rojo azul %}">{{ element...
Tarea	  4:	  Tags	  avanzados a) Hacer	  que	  el	  Hmeline	  muestre	  el	      mensaje	  “No	  hay	  tweets.”	  si	  el	...
extend	  y	  blockbase.html   <html>                <head>                    <title>Mi página personal</title>           ...
Tarea	  4:	  Herencia	  de	  templates a) Descargar	  nuestra	  template	  base.html. b) Incluirla	  en	  vuestra	  app. c...
Índice1. Python                   2. Django    a. Introducción             a. Introducción    b. Tipos	  de	  datos     b....
Modelos
¿SQL?
Ejemplo	  SQLdef book_list(request):    try:        db = MySQLdb.connect(user=me, db=mydb,                                ...
Ejemplo	  SQLdef book_list(request):    try:                 1        db = MySQLdb.connect(user=me, db=mydb,              ...
Ejemplo	  SQLdef book_list(request):    try:                 1                                                     2      ...
Ejemplo	  SQLdef book_list(request):    try:                 1                                                     2      ...
Ejemplo	  SQLdef book_list(request):    try:                 1                                                     2      ...
Ejemplo	  SQLdef book_list(request):    try:                 1                                                     2      ...
Ejemplo	  SQLdef book_list(request):    try:                 1                                                     2      ...
12	  lineas	  de	  Python...	  ¬_¬
ORM	  (Object-­‐RelaHonal	  mapping)
ORM	  (Object-­‐RelaHonal	  mapping)
Ejemplo	  ORMdef book_list(request):   names = Books.objects.all().order_by(name)    return render_to_response(book_list.h...
Ejemplo	  ORMdef book_list(request):1   names = Books.objects.all().order_by(name)    return render_to_response(book_list....
Ejemplo	  ORMdef book_list(request):1   names = Books.objects.all().order_by(name)                                        ...
Fucking	  Ninjas!
Modelo from django.db import models class Books(models.Model):       name = models.CharField(blank=True, max_length=100)  ...
Modelo from django.db import models                  1 class Books(models.Model):       name = models.CharField(blank=True...
Modelo     from django.db import models                  12    class Books(models.Model):           name = models.CharFiel...
Modelo     from django.db import models                  1                            32    class Books(models.Model):    ...
Modelo     from django.db import models                  1                            32    class Books(models.Model):    ...
Modelo     from django.db import models                  1                            32    class Books(models.Model):    ...
Modelo     from django.db import models                  1                            32    class Books(models.Model):    ...
Fucking	  Awesome	  Ninjas!
Tipos	  de	  Datos• AutoField                    • IPAdressField• BigIntegerField              • NullBooleanField• Boolean...
Tipos	  de	  Datos• AutoField                    • IPAdressField• BigIntegerField              • NullBooleanField• Boolean...
Propiedades	  de	  las	  Field• null (True|Flase)       • unique (True|False)• blank (True|False)      • primary_key•   ch...
Propiedades	  de	  las	  Field• null (True|Flase)       • unique (True|False)• blank (True|False)      • primary_key•   ch...
¿Es	  magia?	  No.   BEGIN;   CREATE TABLE "website_books" (       "id" integer NOT NULL PRIMARY KEY,       "name" varchar...
¿Es	  magia?	  No. $ python manage.py sqlall website   BEGIN;   CREATE TABLE "website_books" (       "id" integer NOT NULL...
¿Es	  magia?	  No.•	  Nombres	  de	  tablas	  generados	  automáHcamente.  •	  <app_name>_lower(<model_name>)•	  id	  como...
Configurar	  sesngs.pyDATABASES = {    default: {                           postgresql_psycopg2,        ENGINE: django.db.b...
Configurar	  sesngs.pyDATABASES = {    default: {                             postgresql_psycopg2,        ENGINE: django.db...
Configurar	  sesngs.pyDATABASES = {    default: {                             postgresql_psycopg2,        ENGINE: django.db...
Configurar	  sesngs.pyDATABASES = {    default: {                             postgresql_psycopg2,        ENGINE: django.db...
Creando	  Tablas•	  Crea	  las	  tablas	  para	  todos	  los	  modelos	  de	  las	  apps	  instaladas	    en	  el	  fichero...
Creando	  Tablas                $ python manage.py syncdb•	  Crea	  las	  tablas	  para	  todos	  los	  modelos	  de	  las...
a) Crear	  modelo	  Tweetb)Configurar	  sesngs.pyc) Ver	  el	  SQL	  generado	  con	  sqlall        Nuestro	  primer	  modelo
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_userCrea...
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_user    ...
¿Cuantos	  sistemas	  de	  AutenHcación	  habéis	  programado?
¿Alguno	  era	  mejor	  que	  el	  anterior?	  ;-­‐)
contrib.auth	  puede	  ser	  el	  úlHmo	  :D
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_userCrea...
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_userCrea...
BD	  Lista	  para	  usarse
BD	  Lista	  para	  usarse
a) Hacer	  syncdb       Nuestro	  primer	  modelo
Previo:	  Clases	  del	  ORM  ts = Publisher.objects.all()         Model            Manager                 QuerySet
Previo:	  __unicode__()
Previo:	  __unicode__()    >>> Publisher.objects.all()    [<Publisher: Publisher object>]
Previo:	  __unicode__()    >>> Publisher.objects.all()    [<Publisher: Publisher object>]
Previo:	  __unicode__()    >>> Publisher.objects.all()    [<Publisher: Publisher object>]
Previo:	  __unicode__()    >>> Publisher.objects.all()    [<Publisher: Publisher object>]    class Publisher(models.Model)...
Previo:	  __unicode__()    >>> Publisher.objects.all()    [<Publisher: Publisher object>]    class Publisher(models.Model)...
INSERT
INSERT             o = Model(...)    o.save()a)   >>> p = Publisher(     ...       name=Apress,     ...       address=2855...
INSERT             o = Model(...)    o.save()a)   >>> p = Publisher(     ...       name=Apress,     ...       address=2855...
UPDATE
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
Upcoming SlideShare
Loading in...5
×

Desarrollo web ágil con Python y Django

8,602

Published on

Curso de Python y Django impartido con Jaime irurzun para Bizkaia Enpresa Digitala en el European Software Institute de Zamudio, enero 2011.

Published in: Technology

Transcript of "Desarrollo web ágil con Python y Django"

  1. 1. Desarrollo  web  ágil  con   Python  y  DjangoJorge  Bas7da  Pérez Jaime  Irurzun  Graña   neo2001@gmail.com jaime.irurzun@gmail.com @jorgebas7da @jaimeirurzun
  2. 2. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  3. 3. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  4. 4. • Legible Sintaxis  intuiHva  y  estricta• Produc/vo Entre  1/3  y  1/5  más  conciso  que  Java  o  C++• Portable GNU/Linux,  Windows,  Mac  OS  X,  ...• Extenso Standard  Library,  Third  parHes• Integrable C,  C++,  Java,  .NET,  COM,  WS,  CORBA,  ...• ...  y  Diver/do
  5. 5. Instalación $ sudo apt-get install pythonhttp://www.python.org/download/Snow  Leopard  incluye  las  versiones  2.5.4  y  2.6.1
  6. 6. El  Intérprete
  7. 7. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py#!/usr/bin/env python hola mundo!print "hola mundo!" $
  8. 8. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py#!/usr/bin/env python hola mundo!print "hola mundo!" $ Modo  Interac7vo$ pythonPython 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)[GCC 4.4.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> print "hola mundo!"hola mundo!
  9. 9. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  10. 10. Tipos  de  datosobject +  info:  hMp://docs.python.org/library/stdtypes.html
  11. 11. Tipos  de  datos int 1234 long 35L float 3.1415object +  info:  hMp://docs.python.org/library/stdtypes.html
  12. 12. Tipos  de  datos int 1234 long 35L float 3.1415 bool True Falseobject +  info:  hMp://docs.python.org/library/stdtypes.html
  13. 13. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object +  info:  hMp://docs.python.org/library/stdtypes.html
  14. 14. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] +  info:  hMp://docs.python.org/library/stdtypes.html
  15. 15. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] dict {food: spam, taste: yum} +  info:  hMp://docs.python.org/library/stdtypes.html
  16. 16. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] dict {food: spam, taste: yum} tuple (1, spam, 4, U) +  info:  hMp://docs.python.org/library/stdtypes.html
  17. 17. Tipos  de  datos o   ¡T i p ad mi co! int 1234 long 35L float d iná 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] dict {food: spam, taste: yum} tuple (1, spam, 4, U) +  info:  hMp://docs.python.org/library/stdtypes.html
  18. 18. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  19. 19. Operadores+  info:  hMp://docs.python.org/library/operator.html
  20. 20. Operadores a + b a - b a * b a / bnuméricos a % b -a +a a ** b +  info:  hMp://docs.python.org/library/operator.html
  21. 21. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > bcomparadores a >= b a == b a != b +  info:  hMp://docs.python.org/library/operator.html
  22. 22. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > bcomparadores a >= b a == b a != b lógicos a or b a and b not a +  info:  hMp://docs.python.org/library/operator.html
  23. 23. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  24. 24. Usos  frecuentes:  list
  25. 25. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1
  26. 26. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue
  27. 27. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]
  28. 28. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]>>> len(nums)4
  29. 29. Usos  frecuentes:  str
  30. 30. Usos  frecuentes:  str>>> "Python mola"[1:4]yth
  31. 31. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7
  32. 32. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP no")PHP no mola
  33. 33. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP no")PHP no mola>>> "Python mola".split(" ")[Python, mola]
  34. 34. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP no")PHP no mola>>> "Python mola".split(" ")[Python, mola]>>> " ".join(["Python", "mola"])"Python mola"
  35. 35. Usos  frecuentes:  dict
  36. 36. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]
  37. 37. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] >>> user.get(age, 20)24 24
  38. 38. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] >>> user.get(age, 20)24 24>>> user.has_key(nick)True
  39. 39. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] >>> user.get(age, 20)24 24>>> user.has_key(nick)True>>> user.update({nick: alatar, age: 25})>>> user{nick: alatar, age: 25}
  40. 40. Usos  frecuentes:  str  %
  41. 41. Usos  frecuentes:  str  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio
  42. 42. Usos  frecuentes:  str  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hycker sabe 5 idiomas
  43. 43. Usos  frecuentes:  str  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hycker sabe 5 idiomas>>> t = "%(NOMBRE)s sabe %(IDIOMAS)i idiomas">>> v = {NOMBRE: Hycker, IDIOMAS: 5}>>> t % vHycker sabe 5 idiomas
  44. 44. Módulossound/ __init__.py 1. Un  módulo  es  un  fichero  .py formats/ __init__.py wavread.py wavwrite.py 2. Los  módulos  pueden   aiffread.py aiffwrite.py auread.py organizarse  en  paquetes. auwrite.py ... effects/ __init__.py 3. Un  paquete  es  una  carpeta   echo.py surround.py reverse.py que  conHene  un  fichero  con   ... filters/ __init__.py nombre  __init__.py equalizer.py vocoder.py karaoke.py ...
  45. 45. Módulossound/ 2 __init__.py 1. Un  módulo  es  un  fichero  .py formats/ __init__.py wavread.py wavwrite.py 2. Los  módulos  pueden   1 aiffread.py aiffwrite.py auread.py organizarse  en  paquetes. auwrite.py ... effects/ __init__.py 3 3. Un  paquete  es  una  carpeta   echo.py surround.py reverse.py que  conHene  un  fichero  con   ... filters/ __init__.py nombre  __init__.py equalizer.py vocoder.py karaoke.py ...
  46. 46. Módulos import math ¿Dónde  los  busca  Python?En  la  lista  de  directorios  que  conHene  la  lista  sys.path: 1. El  directorio  actual: ./ 2. El  directorio  site-packages  de  nuestro  Python: /usr/local/lib/python2.6/site-packages 3. Los  directorios  apuntados  por  PYTHONPATH: $ env | grep PYTHONPATH 4. El  directorio  de  la  instalación  de  Python: /usr/lib/python2.6/
  47. 47. Módulossound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ __init__.py echo.py surround.py reverse.py ... filters/ __init__.py equalizer.py vocoder.py karaoke.py ...
  48. 48. Módulossound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... effects/ __init__.py echo.py surround.py reverse.py ... filters/ __init__.py equalizer.py vocoder.py karaoke.py ...
  49. 49. Módulossound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... from sound.effects.echo import echofilter effects/ echofilter(...) __init__.py echo.py surround.py reverse.py ... filters/ __init__.py equalizer.py vocoder.py karaoke.py ...
  50. 50. Módulossound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... from sound.effects.echo import echofilter effects/ echofilter(...) __init__.py echo.py surround.py reverse.py ... from sound.effects.echo import * filters/ echofilter(...) __init__.py equalizer.py vocoder.py karaoke.py ...
  51. 51. Módulossound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... from sound.effects.echo import echofilter effects/ echofilter(...) __init__.py echo.py surround.py reverse.py ... from sound.effects.echo import * filters/ echofilter(...) __init__.py equalizer.py vocoder.py karaoke.py from sound.effects import echo as rev ... rev.echofilter(...)
  52. 52. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  53. 53. Estructuras {}
  54. 54. Estructuras {}
  55. 55. Identación>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance
  56. 56. Identación>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance PEP 8 4  Espacios  para  indicar  la  identación
  57. 57. ¿PEP  8? PEP 8•  Guido  van  Rossum  (2001)•  Recomendaciones  de  esHlo•  “Readability  counts”•  “Code  is  read  much  more  ofen  than  it  is  wrigen.”•  Muy  recomendable  importante  seguirlo. hMp://www.python.org/dev/peps/pep-­‐0008/
  58. 58. Funcionesdef my_first_function(p1, p2): return "Hello World!"
  59. 59. Funciones1 def my_first_function(p1, p2): return "Hello World!"
  60. 60. Funciones 21 def my_first_function(p1, p2): return "Hello World!"
  61. 61. Funciones 21 def my_first_function(p1, p2): 3 return "Hello World!"
  62. 62. Funciones 21 def my_first_function(p1, p2): 3 return "Hello World!" PEP 8 Recomendaciones: •  Minúsculas •  Palabras  separadas  por  _ •  Evitar  camelCase
  63. 63. Conversión  de  /pos +info:  hMp://docs.python.org/library/func7ons.html
  64. 64. Conversión  de  /pos>>> int(1.3)1 +info:  hMp://docs.python.org/library/func7ons.html
  65. 65. Conversión  de  /pos>>> int(1.3)1>>> str(2)2 +info:  hMp://docs.python.org/library/func7ons.html
  66. 66. Conversión  de  /pos>>> int(1.3)1>>> str(2)2>>> float(1)1.0 +info:  hMp://docs.python.org/library/func7ons.html
  67. 67. Conversión  de  /pos>>> int(1.3)1 >>> tuple([1,2,3]) (1, 2, 3)>>> str(2)2>>> float(1)1.0 +info:  hMp://docs.python.org/library/func7ons.html
  68. 68. Conversión  de  /pos>>> int(1.3)1 >>> tuple([1,2,3]) (1, 2, 3)>>> str(2)2 >>> list((1,2,3)) [1, 2, 3]>>> float(1)1.0 +info:  hMp://docs.python.org/library/func7ons.html
  69. 69. Funciones  comunes +info:  hMp://docs.python.org/library/func7ons.html
  70. 70. Funciones  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4 +info:  hMp://docs.python.org/library/func7ons.html
  71. 71. Funciones  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4>>> range(5)[0, 1, 2, 3, 4]>>> range(1,7)[1, 2, 3, 4, 5, 6]>>> range(1,7,2)[1, 3, 5] +info:  hMp://docs.python.org/library/func7ons.html
  72. 72. Funciones  comunes >>> type(True)>>> len("Python Mola") <type bool>11 >>> type("Python Mola")>>> len([1,2,3,4]) <type str>4>>> range(5)[0, 1, 2, 3, 4]>>> range(1,7)[1, 2, 3, 4, 5, 6]>>> range(1,7,2)[1, 3, 5] +info:  hMp://docs.python.org/library/func7ons.html
  73. 73. Funciones  comunes >>> type(True)>>> len("Python Mola") <type bool>11 >>> type("Python Mola")>>> len([1,2,3,4]) <type str>4>>> range(5) >>> sum([0,1,2,3,4])[0, 1, 2, 3, 4] 10>>> range(1,7) >>> sum(range(5))[1, 2, 3, 4, 5, 6] 10>>> range(1,7,2)[1, 3, 5] Y  un  muy  largo  etc... +info:  hMp://docs.python.org/library/func7ons.html
  74. 74. Funciones  interesantes Son  sólo  un  ejemplo... +info:  hMp://docs.python.org/library/func7ons.html
  75. 75. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)] Son  sólo  un  ejemplo... +info:  hMp://docs.python.org/library/func7ons.html
  76. 76. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2])[1, 2, 3, 4, 5] Son  sólo  un  ejemplo... +info:  hMp://docs.python.org/library/func7ons.html
  77. 77. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6] >>> round(1.2345,2)>>> zip(a,b) 1.23[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2])[1, 2, 3, 4, 5] Son  sólo  un  ejemplo... +info:  hMp://docs.python.org/library/func7ons.html
  78. 78. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6] >>> round(1.2345,2)>>> zip(a,b) 1.23[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2]) >>> map(str,[1,2,3,4,5])[1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Son  sólo  un  ejemplo... +info:  hMp://docs.python.org/library/func7ons.html
  79. 79. Funciones  de  ayuda
  80. 80. Funciones  de  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, __eq__, __format__, __ge__,__getattribute__, __getitem__, __getslice__, __gt__, __hash__,__iadd__, __imul__, __init__, __iter__, __le__, __len__,__lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__,__repr__, __reversed__, __rmul__, __setattr__, __setitem__,__setslice__, __sizeof__, __str__, __subclasshook__, append,count, extend, index, insert, pop, remove, reverse, sort]
  81. 81. Funciones  de  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, __eq__, __format__, __ge__,__getattribute__, __getitem__, __getslice__, __gt__, __hash__,__iadd__, __imul__, __init__, __iter__, __le__, __len__,__lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__,__repr__, __reversed__, __rmul__, __setattr__, __setitem__,__setslice__, __sizeof__, __str__, __subclasshook__, append,count, extend, index, insert, pop, remove, reverse, sort]>>> help(filter)Help on built-in function filter in module __builtin__:filter(...) filter(function or None, sequence) -> list, tuple, or string Return those items of sequence for which function(item) is true. If function is None, return the items that are true. If sequence is a tuple or string, return the same type, else return a list.(END)
  82. 82. Clasesclass Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return My name is %s % self.name s = Student("Jorge", 24)
  83. 83. Clases 1class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return My name is %s % self.name s = Student("Jorge", 24)
  84. 84. Clases 1 2class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return My name is %s % self.name s = Student("Jorge", 24)
  85. 85. Clases 1 2class Student(object): 3 def __init__(self, name, age): self.name = name self.age = age def hello(self): return My name is %s % self.name s = Student("Jorge", 24)
  86. 86. Clases 1 2class Student(object): 3 def __init__(self, name, age): 4 self.name = name self.age = age def hello(self): return My name is %s % self.name s = Student("Jorge", 24)
  87. 87. Clases 1 2class Student(object): 3 def __init__(self, name, age): 4 self.name = name self.age = age def hello(self): 5 return My name is %s % self.name s = Student("Jorge", 24)
  88. 88. Clases 1 2class Student(object): 3 def __init__(self, name, age): 4 self.name = name self.age = age def hello(self): 5 return My name is %s % self.name s = Student("Jorge", 24) PEP 8 Recomendaciones: •  CamelCase
  89. 89. El  operador  ()• Es  importante  diferenciar: funcion      vs      funcion() Clase              vs        Clase()• El  operador  ()  permite: • Invocar  funciones: resultado = funcion() • Instanciar  clases: objeto = Clase("param1")
  90. 90. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  91. 91. Sentencias:  if-­‐else$name = "Jon"; name = "Jon"if($name == "Jon"){ if name == "Jon": $name = "Jon Rocks!"; name = "Jon Rocks!"} elif name == "Mary":elseif($name == "Mary"){ name = "Hello Mary" $name = "Hello Mary"; else:} name = "Who are you?"else{ $name = "Who are you?"}
  92. 92. Sentencias:  while $count = 0; while ($count < 5) { echo "Number ".$count; $count+=1; } count = 0 while count < 5: print "Number %i" % count count+=1
  93. 93. Sentencias:  for for ($i=0; $i < 5; $i++) { echo "Number ".$count; } for i in range(4): print "Number %i" % count
  94. 94. Sentencias:  try-­‐except try { $result = 3 / 0; } catch (Exception $e) { echo "Division by Zero" } try: result = 3 / 0 except: print "Division by Zero"
  95. 95. Prueba  de  sentencias  en  consola
  96. 96. Conclusiones•  Python  es  un  lenguaje  fácil  de  aprender.•  Menos  código: •  Muchos  Muchísimos  menos  errores  de  Sintaxis. •  Mayor  velocidad  de  escritura.•  ProtoHpado...  UHlizado  por  grandes  empresas.
  97. 97. Conclusiones•  Python  es  un  lenguaje  fácil  de  aprender.•  Menos  código: •  Muchos  Muchísimos  menos  errores  de  Sintaxis. •  Mayor  velocidad  de  escritura.•  ProtoHpado...  UHlizado  por  grandes  empresas. etc...
  98. 98. Ejemplo  &  Ejercicio
  99. 99. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  100. 100. Evolución  de  la  Web Desarrollo  Web1ª  Generación 2ª  Generación 3ª  Generación HTML PHP Django CGI ASP Rails JSP Symfony ... ...
  101. 101. Frameworks  web
  102. 102. Django:  Qué  y  dónde
  103. 103. FilosoXa•  Loose  coupling,    Acoplamiento  débil. •  Cada  capa  es  independiente  y  desconoce  completamente     a  las  demás.•  Menos  código.•  Rápido  desarrollo. •  Esto  es  el  siglo  21,  todo  el  trabajo  tedioso  hay  que  evitarlo.•  Don’t  Repeat  Yourself  (DRY)
  104. 104. FilosoXa•  Loose  coupling,    Acoplamiento  débil. •  Cada  capa  es  independiente  y  desconoce  completamente     a  las  demás.•  Menos  código.•  Rápido  desarrollo. •  Esto  es  el  siglo  21,  todo  el  trabajo  tedioso  hay  que  evitarlo.•  Don’t  Repeat  Yourself  (DRY)“ Every distinct concept and/or piece of data should live in one, and only one, place. Redundancy is bad. Normalization is good.”
  105. 105. FilosoXa•  Explicit  is  beger  than  implicit. •  Este  es  un  principio  de  Python. •  Django  no  debe  hacer  demasiada  “Magia”. •  Si  algo  es  “Mágico”  ha  de  haber  una  buena  razón.•  Consistencia •  Ha  de  ser  consistente  a  todos  los  niveles.•  Eficiencia,  Seguridad,  Flexibilidad  y  Simplicidad. hMp://docs.djangoproject.com/en/dev/misc/design-­‐philosophies/
  106. 106. La  comunidad
  107. 107. La  comunidad• django-­‐users 18.000  miembros
  108. 108. La  comunidad• django-­‐users 18.000  miembros• django-­‐developers 5.900  miembros
  109. 109. La  comunidad• django-­‐users 18.000  miembros• django-­‐developers 5.900  miembros• djangoproject.com 500.000  visitas  únicas  mensuales
  110. 110. ¿Quién  usa  Django?
  111. 111. ¿Quién  usa  Django? etc...
  112. 112. 1.  Instalación  Python $ sudo apt-get install python http://www.python.org/download/ Snow  Leopard  incluye  las  versiones  2.5.4  y  2.6.1
  113. 113. 2.  Instalación  SGBDConfigurar  un  motor  de  Base  de  Datos: •  Oficiales:   •  Comunidad:   •  PostgreSQL •  Sybase  SQL  Anywhere •  MySQL •  IBM  DB2 •  Microsof  SQL  Server  2005 •  Oracle •  Firebird •  SQLite •  ODBC
  114. 114. 2.  Instalación  SGBDConfigurar  un  motor  de  Base  de  Datos: •  Oficiales:   •  Comunidad:   •  PostgreSQL •  Sybase  SQL  Anywhere •  MySQL •  IBM  DB2 •  Microsof  SQL  Server  2005 •  Oracle •  Firebird •  SQLite •  ODBC
  115. 115. 2.  Instalación  SGBD•  Vamos  a  uHlizar  SQLite  por  comodidad•  Desde  Python  2.5  podemos  uHlizar  sqlite    sin  instalar  nada.
  116. 116. 2.  Instalación  SGBD•  Vamos  a  uHlizar  SQLite  por  comodidad•  Desde  Python  2.5  podemos  uHlizar  sqlite    sin  instalar  nada.
  117. 117. 3.  Instalación  DjangoA:  Paquetes  de  cada  distro • apt-get install python-djangoB:  Official  Release • hMp://www.djangoproject.com/download/ • python setup.py installC:  Trunk • hMp://code.djangoproject.com/svn/django/trunk/
  118. 118. All  Right?
  119. 119. All  Right?>>> import django>>> django.VERSION(1, 2, 3, final, 0)>>> import djangoTraceback (most recent call last): File "<stdin>", line 1, in <module>ImportError: No module named django
  120. 120. Bienvenidos  al  mundo  de  Oz
  121. 121. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? *  Incluida  la  carpeta  del  proyecto
  122. 122. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar?FicherosCarpetas *  Incluida  la  carpeta  del  proyecto
  123. 123. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails SymfonyFicheros 149 117Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  124. 124. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails SymfonyFicheros 149 117Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  125. 125. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony DjangoFicheros 149 117 4Carpetas 35 29 1 *  Incluida  la  carpeta  del  proyecto
  126. 126. Let’s  enjoy
  127. 127. Crear  nuestro  proyecto de  4  ficheros  ;-­‐)
  128. 128. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin startproject dwitter
  129. 129. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin startproject dwitter __init__.py manage.py settings.py urls.py
  130. 130. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin startproject dwitter __init__.py manage.py settings.py urls.py -­‐  ¿Esto  es  un  proyecto...  ?      Si  os  ve  mi  jefe...
  131. 131. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin startproject dwitter __init__.py manage.py settings.py urls.py -­‐  ¿Esto  es  un  proyecto...  ?      Si  os  ve  mi  jefe... -­‐  Sí,  disponemos  de  un  proyecto  ‘funcional’  en  django.
  132. 132. sesngs.py
  133. 133. Arrancar  nuestro  proyecto de  4  ficheros  ;-­‐)
  134. 134. Arrancar  nuestro  proyecto de  4  ficheros  ;-­‐) $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.1, using settings dwitter.settings Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C.
  135. 135. Arrancar  nuestro  proyecto de  4  ficheros  ;-­‐) $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.1, using settings dwitter.settings Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C.
  136. 136. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  137. 137. MVC  en  DjangoModelo  =  Model Vista  =  Template Controlador  =  URL+View
  138. 138. URLs  y  Vistas• El  fichero  urls.py  actúa  como  puerta  de  entrada  para  las   pe7ciones  HTTP• Se  definen  URLs  elegantes  mediante  expresiones  regulares   que  redirigen  a  funciones  de  views.py hMp://mysite.com/about/ urls.py ¿urlpaMerns? html views.py ...
  139. 139. URLs  y  Vistas• La  función  de  views.py  recibe  como  parámetros  un  objeto   HhpRequest  y  todos  los  parámetros  de  la  URL  capturados,   teniendo  que  devolver  siempre  un  objeto  HhpResponse HhpRequest(),  ... views.py HhpResponse()
  140. 140. URLs  y  Vistas Ejemplo  1:    http://mysite.com/time from django.conf.urls.defaults import * from mysite.views import hora_actual urls.py urlpatterns = patterns(, (r^time/$, hora_actual), ) from django.http import HttpResponse from datetime import datetimeviews.py def hora_actual(request): now = datetime.now() html = "Son las %s." % now return HttpResponse(html)
  141. 141. URLs  y  Vistas Ejemplo  2:    http://mysite.com/time/plus/2 from django.conf.urls.defaults import * from mysite.views import dentro_de urls.py urlpatterns = patterns(, (r^time/plus/(d{1,2})/$, dentro_de), ) from django.http import HttpResponse from datetime import datetime, timedelta def dentro_de(request, offset):views.py offset = int(offset) dt = datetime.now() + timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt) return HttpResponse(html)
  142. 142. URLs  y  Vistas Ejemplo  2:    http://mysite.com/time/plus/2 from django.conf.urls.defaults import * from mysite.views import dentro_de urls.py urlpatterns = patterns(, (r^time/plus/(d{1,2})/$, dentro_de), ) from django.http import HttpResponse from datetime import datetime, timedelta def dentro_de(request, offset):views.py offset = int(offset) dt = datetime.now() + timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt) return HttpResponse(html)
  143. 143. ¡Recuerda!:  MVC
  144. 144. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  145. 145. Templates• Separan  la  lógica  de  presentación  a  una  capa  independiente. • Ficheros  independientes  (.html) • Lenguaje  independiente  (¡para  diseñadores!)
  146. 146. Templates • Se  basan  en  dos  7pos  de  objetos:  Template()  y  Context(). • Un  objeto  Template()  con7ene  el  string  de  salida  que   queremos  devolver  en  el  HMpResponse  (normalmente   HTML),  pero  incluyendo  e7quetas  especiales  de  Django. • Un  objeto  Context()  con7ene  un  diccionario  con  los   valores  que  dan  contexto  a  una  plan7lla,  los  que  deben   usarse  para  renderizar  un  objeto  Template().Template: "Bienvenido, {{ user }}." "Bienvenido, alatar." Context: {user: alatar}
  147. 147. Templates• Primera  aproximación  al  obje7vo:  Template  +  Context from django.http import HttpResponse from django.template import Template, Context from datetime import datetime PLANTILLA = """<html><body> Son las {{ hora }}. </body></html>""" def hora_actual(request): now = datetime.now() t = Template(PLANTILLA) c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  148. 148. Templates• Segunda  aproximación  al  obje7vo:  open(),  read(),  close() from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() fp = open(/home/django/templates/hora.html) t = Template(fp.read()) fp.close() c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  149. 149. Templates• Segunda  aproximación  al  obje7vo:  open(),  read(),  close() from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() fp = open(/home/django/templates/hora.html) t = Template(fp.read()) fp.close() c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  150. 150. Templates• Segunda  aproximación  al  obje7vo:  open(),  read(),  close() from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() Bo ring   plate   fp = open(/home/django/templates/hora.html) boiler t = Template(fp.read()) fp.close() code! c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  151. 151. Templates• Tercera  aproximación  al  obje7vo:  get_template() TEMPLATE_DIRS = ( sesngs.py /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  152. 152. Templates• Tercera  aproximación  al  obje7vo:  get_template() TEMPLATE_DIRS = ( sesngs.py /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  153. 153. Templates• Tercera  aproximación  al  obje7vo:  get_template() TEMPLATE_DIRS = ( sesngs.py /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): S7ll   now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) boring... return HttpResponse(html)
  154. 154. Templates• Obje7vo  alcanzado:  render_to_response() from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response(hora.html, {hora: now})
  155. 155. Templates• Obje7vo  alcanzado:  render_to_response() from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response(hora.html, {hora: now}) Bori ng...?
  156. 156. Templates• Obje7vo  alcanzado:  render_to_response() from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response(hora.html, {hora: now}) AWESOME!
  157. 157. Templates:  Tip TEMPLATE_DIRS = (a) sesngs.py /home/django/templates, )
  158. 158. Templates:  Tip TEMPLATE_DIRS = ( Reusa ble  a) sesngs.py /home/django/templates, ) apps?
  159. 159. Templates:  Tip TEMPLATE_DIRS = ( Reusa ble  a) sesngs.py /home/django/templates, ) apps?b) Alterna7va  reu7lizable: TEMPLATE_LOADERS = ( django.template.loaders.filesystem.Loader, django.template.loaders.app_directories.Loader, ) • La  carpeta  /templates  es  buscada  dentro  de  cada  app. • Conviene  incluir  una  carpeta  con  el  nombre  de  la  app  por  claridad. return render_to_response(website/index.html)
  160. 160. a) Crear  la  app  dwiger.website.b) Incluir  la  app  en  sesngs.py.c) Definir  una  vista  para  la  URL  “/”  que   devuelva  el  texto  “Bienvenidos  a   dwiger”: ‣/ ‣ timeline(request) ¡Empieza  nuestro  primer  proyecto!
  161. 161. Tarea  1:  URLs  y  Vistas a) Definir  todas  las  URLs  y  vistas  (vacías)   que  va  a  tener  el  proyecto: ‣ user/<username>/status/<tweet_id>/ ‣ tweet_page(request, tweet_id) ‣ user/<username>/ ‣ user_page(request, username) ‣ users/ ‣ users_list(request) ‣ user/<username>/follow/ ‣ follow_user(request, username) ‣ user/<username>/unfollow/ ‣ unfollow_user(request, username)
  162. 162. Tarea  1:  URLs  y  Vistas b) Implementar  la  vista  timeline()  para   que  renderice  un  Hmeline  de  twiger  en   una  template  index.html  a  parHr  de   datos  hardcodeados  en  un  diccionario.
  163. 163. Templates  en  detalle•  Si,  otro  sistema  de  templates •  Smarty,  Tiles,  ClearSilver  ...  •Describen  cuál  va  a  ser  el  resultado  que  ven  los  usuarios. •  Desacoplado  de  Python  (  Diseñadores  muy  lejos  de  Python  )•  HTML  (o  no)...  con  esteroides.•  Muy  sencillo  de  aprender •  KISS:  Keep  It  Simple,  Stupid•  Muy  sencillo  de  extender
  164. 164. FilosoXa  y  Limitaciones•  La  sintaxis  debe  estar  desacoplada  del  HTML/XML.•  Los  diseñadores  saben  HTML.•  Los  diseñadores  no  saben  Python.•  No  consiste  en  inventarse  un  lenguaje.•  Una  variable  no  puede  cambiar  el  valor  de  una  variable.•  Una  template  no  puede  ejecutar  código  Python.
  165. 165. Templates:  {{}}<html> <head>Ejemplo templates</head> <body> Hola, {{ username }}. </body></html> {username: juan}<html> <head>Ejemplo templates</head> <body> Hola, juan. </body></html>
  166. 166. Filters  y  Tags
  167. 167. Filters  y  Tags
  168. 168. Filters  y  Tagsfilter {{ varible|filter }}
  169. 169. Filters  y  Tags filter {{ varible|filter }}inline  tag {% tag var1 var2 %}
  170. 170. Filters  y  Tags filter {{ varible|filter }}inline  tag {% tag var1 var2 %}block  tag {% tag var1 %} ... {% endtag %}
  171. 171. Templates:  tags  {%  %}
  172. 172. Templates:  tags  {%  %}comment {% comment %} Bu! {% endcomment %}
  173. 173. Templates:  tags  {%  %}comment {% comment %} Bu! {% endcomment %} for {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %}
  174. 174. Templates:  tags  {%  %}comment {% comment %} Bu! {% endcomment %} for {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %} if {% if username == "Juan" %} Hola Juan, me gustas! == != > < >= <= in and or not {% else %} Hola {{ username }}, {% endif %}
  175. 175. Tarea  2:  Tags a) UHlizar  tags  para  que  el  Hmeline  se   muestre  con  el  siguiente  formato: • <username>:  <tweet> • <username>:  <tweet> • ...  
  176. 176. Templates:  Filters <html> <head>Ejemplo templates</head>/tle <body> Hola, {{ username|title }}. </body> </html> {username: juan} <html> <head>Ejemplo templates</head> <body> Hola, Juan. </body> </html>
  177. 177. Templates:  Filters
  178. 178. Templates:  Filters {username: Juan es majo}length {{ username|length }} 12
  179. 179. Templates:  Filters {username: Juan es majo}length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo
  180. 180. Templates:  Filters {username: Juan es majo}length {{ username|length }} 12 cut {{ username|cut }} Juanesmajoslugify {{ username|slugify }} juan-es-majo
  181. 181. Templates:  Filters {username: Juan es majo} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majowordcount {{ username|wordcount }} 3
  182. 182. Templates:  Filters {username: Juan es majo} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majowordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO
  183. 183. Templates:  Filters {username: Juan es majo} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majowordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO {username: None} default {{ username|default:”Desconocido” }} Desconocido
  184. 184. Templates:  Filters
  185. 185. Templates:  Filters{username: Juan es <b>majo, guapo y <em>listo</em></b>} striptags {{ username|striptags }} Juan es majo guapo y listo
  186. 186. Templates:  Filters {username: Juan es <b>majo, guapo y <em>listo</em></b>} striptags {{ username|striptags }} Juan es majo guapo y listotruncatewords_html {{ username|truncatewords_html:4 }} Juan es <b>majo guapo</b> ...
  187. 187. Templates:  Filters {username: Juan es <b>majo, guapo y <em>listo</em></b>} striptags {{ username|striptags }} Juan es majo guapo y listotruncatewords_html {{ username|truncatewords_html:4 }} Juan es <b>majo guapo</b> ... removetags {{ username|removetags:”em a br” }} Juan es <b>majo guapo y listo</b>
  188. 188. Templates:  Filters
  189. 189. Templates:  Filters{url: Visitad http://www.djangoproject.com} urlize {{ url|urlize }} Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a>
  190. 190. Templates:  Filters{url: Visitad http://www.djangoproject.com} urlize {{ url|urlize }} Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a>urlizetrunc {{ url|urlizetrunc:16 }} Visitad <a href=”http://www.djangoproject.com”> http://www.djang...</a>
  191. 191. Templates:  Filters{lista: [States, [Kansas, [Lawrence, Topeka], Illinois]]}
  192. 192. Templates:  Filters{lista: [States, [Kansas, [Lawrence, Topeka], Illinois]]} unordered_list {{ lista|unordered_list }} <li>States <ul> <li>Kansas <ul> <li>Lawrence</li> <li>Topeka</li> </ul> </li> <li>Illinois</li> </ul> </li>
  193. 193. Templates:  Filters
  194. 194. Templates:  Filters {value: 123456789}add {{ value|add:”1” }} 123456790
  195. 195. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB
  196. 196. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010
  197. 197. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010/mesince {{ date|timesince }} 4 days, 6 hours
  198. 198. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010/mesince {{ date|timesince }} 4 days, 6 hours/meun/l {{ date|timeuntil }} 1 days, 6 hours
  199. 199. Tarea  3:  Filters a) Añadir  a  cada  tweet  del  Hmeline  el   Hempo  transcurrido: • <username>:  <tweet> <n>  seconds  ago • <username>:  <tweet> <n>  minutes  ago • ...
  200. 200. Tarea  3:  Filters b) Formatear  las  publicaciones  de   HOYGANs  convirHendo  el  texto  a   minúsculas  capitalizadas: ‣ “HOYGAN  NESESITO  QUE  MAYUDEN  A   HASER  UN  PROGRAMA  EN  DJANGO   GRASIAS  DE  ANTEBRASO” ‣ “Hoygan  necesito  que  mayuden  a  haser   un  programa  en  django  grasias  de   antebraso”  
  201. 201. Tarea  3:  Filters c) Conseguir  que  todas  las  urls  que   aparezcan  en  los  tweets  se  conviertan   en  enlaces  <a  href=...  />  de  HTML.
  202. 202. Templates:  tags  {%  %}
  203. 203. Templates:  tags  {%  %}cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}
  204. 204. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}include {% include "foo/bar.html" %}
  205. 205. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}include {% include "foo/bar.html" %}forloop {% for elemento in lista %} <li>{{ forloop.counter }}.{{ elemento }}<li> {% endfor %}
  206. 206. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}include {% include "foo/bar.html" %}forloop {% for elemento in lista %} <li>{{ forloop.counter }}.{{ elemento }}<li> {% endfor %}empty {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% empty %} Sin elementos. {% endfor %}
  207. 207. Tarea  4:  Tags  avanzados a) Hacer  que  el  Hmeline  muestre  el   mensaje  “No  hay  tweets.”  si  el   diccionario  recibido  está  vacío.  
  208. 208. extend  y  blockbase.html <html> <head> <title>Mi página personal</title> </head> <body> {% block content %} Contenido por defecto. {% endblock %} </body> </html>hija.html {% extends "base.html" %} {% block content %} Hola desde la portada. {% endblock %}
  209. 209. Tarea  4:  Herencia  de  templates a) Descargar  nuestra  template  base.html. b) Incluirla  en  vuestra  app. c) Hacer  que  vuestro  index.html  herede   de  base.html  y  exHenda  el  bloque   ‘content’  con  su  contenido.
  210. 210. Índice1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  211. 211. Modelos
  212. 212. ¿SQL?
  213. 213. Ejemplo  SQLdef book_list(request): try: db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  214. 214. Ejemplo  SQLdef book_list(request): try: 1 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  215. 215. Ejemplo  SQLdef book_list(request): try: 1 2 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  216. 216. Ejemplo  SQLdef book_list(request): try: 1 2 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) 3 cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  217. 217. Ejemplo  SQLdef book_list(request): try: 1 2 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) 3 cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) 4 names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  218. 218. Ejemplo  SQLdef book_list(request): try: 1 2 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) 3 cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) 4 names = [] for row in cursor.fetchall() 5 names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  219. 219. Ejemplo  SQLdef book_list(request): try: 1 2 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) 3 cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) 4 names = [] for row in cursor.fetchall() 5 names.append(row[0]) db.close() except: return render_to_response(500.html) 6 return render_to_response(book_list.html, {names:names})
  220. 220. 12  lineas  de  Python...  ¬_¬
  221. 221. ORM  (Object-­‐RelaHonal  mapping)
  222. 222. ORM  (Object-­‐RelaHonal  mapping)
  223. 223. Ejemplo  ORMdef book_list(request): names = Books.objects.all().order_by(name) return render_to_response(book_list.html, {names:names})
  224. 224. Ejemplo  ORMdef book_list(request):1 names = Books.objects.all().order_by(name) return render_to_response(book_list.html, {names:names})
  225. 225. Ejemplo  ORMdef book_list(request):1 names = Books.objects.all().order_by(name) 2 return render_to_response(book_list.html, {names:names})
  226. 226. Fucking  Ninjas!
  227. 227. Modelo from django.db import models class Books(models.Model): name = models.CharField(blank=True, max_length=100) created = models.DateTimeField(blank=False) available = models.BooleanField(default=True)•  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...)•  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  228. 228. Modelo from django.db import models 1 class Books(models.Model): name = models.CharField(blank=True, max_length=100) created = models.DateTimeField(blank=False) available = models.BooleanField(default=True)•  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...)•  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  229. 229. Modelo from django.db import models 12 class Books(models.Model): name = models.CharField(blank=True, max_length=100) created = models.DateTimeField(blank=False) available = models.BooleanField(default=True) •  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...) •  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  230. 230. Modelo from django.db import models 1 32 class Books(models.Model): name = models.CharField(blank=True, max_length=100) created = models.DateTimeField(blank=False) available = models.BooleanField(default=True) •  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...) •  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  231. 231. Modelo from django.db import models 1 32 class Books(models.Model): name = models.CharField(blank=True, max_length=100) 4 created = models.DateTimeField(blank=False) available = models.BooleanField(default=True) •  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...) •  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  232. 232. Modelo from django.db import models 1 32 class Books(models.Model): name = models.CharField(blank=True, max_length=100) 4 created = models.DateTimeField(blank=False) 5 available = models.BooleanField(default=True) •  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...) •  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  233. 233. Modelo from django.db import models 1 32 class Books(models.Model): name = models.CharField(blank=True, max_length=100) 4 created = models.DateTimeField(blank=False) 5 available = models.BooleanField(default=True) 6 •  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...) •  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  234. 234. Fucking  Awesome  Ninjas!
  235. 235. Tipos  de  Datos• AutoField • IPAdressField• BigIntegerField • NullBooleanField• BooleanField • PositiveIntegerField• CharField • PositiveSmallIntegerField• CommaSeparatedIntegerField • SlugField• DateField • SmallIntegerField• DateTimeField • TextField• DecimalField • TimeField• EmailField • URLField• FileField • XMLField• FilePathField • ForeingKey• FloatField • ManyToManyField• ImageField • OneToOneField• IntegerField
  236. 236. Tipos  de  Datos• AutoField • IPAdressField• BigIntegerField • NullBooleanField• BooleanField • PositiveIntegerField• CharField • PositiveSmallIntegerField• CommaSeparatedIntegerField • SlugField• DateField • SmallIntegerField• DateTimeField • TextField• DecimalField • TimeField• EmailField • URLField• FileField • XMLField• FilePathField • ForeingKey• FloatField • ManyToManyField• ImageField • OneToOneField• IntegerField
  237. 237. Propiedades  de  las  Field• null (True|Flase) • unique (True|False)• blank (True|False) • primary_key• choices (lista) • unique_for_date• default (valor) • unique_for_month• editable (True|False) • unique_for_year• help_text (String)
  238. 238. Propiedades  de  las  Field• null (True|Flase) • unique (True|False)• blank (True|False) • primary_key• choices (lista) • unique_for_date• default (valor) • unique_for_month• editable (True|False) • unique_for_year• help_text (String)
  239. 239. ¿Es  magia?  No. BEGIN; CREATE TABLE "website_books" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" datetime NOT NULL, "available" bool NOT NULL ); COMMIT;BEGIN;CREATE TABLE "website_books" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" timestamp with time zone NOT NULL, "available" boolean NOT NULL);COMMIT;
  240. 240. ¿Es  magia?  No. $ python manage.py sqlall website BEGIN; CREATE TABLE "website_books" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" datetime NOT NULL, "available" bool NOT NULL ); COMMIT;BEGIN;CREATE TABLE "website_books" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" timestamp with time zone NOT NULL, "available" boolean NOT NULL);COMMIT;
  241. 241. ¿Es  magia?  No.•  Nombres  de  tablas  generados  automáHcamente. •  <app_name>_lower(<model_name>)•  id  como  Primary  Key  (Personalizable)•  Las  Foreing  Key  terminan  en  _id  (Personalizable)•  Los  Hpos  de  datos  se  ajustan  en  función  del  SGBD
  242. 242. Configurar  sesngs.pyDATABASES = { default: { postgresql_psycopg2, ENGINE: django.db.backends., postgresql, mysql, NAME: , sqlite3 or oracle. USER: , PASSWORD: , HOST: , PORT: , }}
  243. 243. Configurar  sesngs.pyDATABASES = { default: { postgresql_psycopg2, ENGINE: django.db.backends., 1 postgresql, mysql, NAME: , sqlite3 or oracle. USER: , PASSWORD: , HOST: , PORT: , }}
  244. 244. Configurar  sesngs.pyDATABASES = { default: { postgresql_psycopg2, ENGINE: django.db.backends., 1 postgresql, mysql, NAME: , 2 sqlite3 or oracle. USER: , PASSWORD: , HOST: , PORT: , }}
  245. 245. Configurar  sesngs.pyDATABASES = { default: { postgresql_psycopg2, ENGINE: django.db.backends., 1 postgresql, mysql, NAME: , 2 sqlite3 or oracle. USER: , PASSWORD: , 3 HOST: , PORT: , }}
  246. 246. Creando  Tablas•  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  sesngs.py•  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  247. 247. Creando  Tablas $ python manage.py syncdb•  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  sesngs.py•  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  248. 248. a) Crear  modelo  Tweetb)Configurar  sesngs.pyc) Ver  el  SQL  generado  con  sqlall Nuestro  primer  modelo
  249. 249. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  250. 250. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_user django.contrib.authCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  251. 251. ¿Cuantos  sistemas  de  AutenHcación  habéis  programado?
  252. 252. ¿Alguno  era  mejor  que  el  anterior?  ;-­‐)
  253. 253. contrib.auth  puede  ser  el  úlHmo  :D
  254. 254. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweet website.tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  255. 255. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): admin django.contrib.authE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  256. 256. BD  Lista  para  usarse
  257. 257. BD  Lista  para  usarse
  258. 258. a) Hacer  syncdb Nuestro  primer  modelo
  259. 259. Previo:  Clases  del  ORM ts = Publisher.objects.all() Model Manager QuerySet
  260. 260. Previo:  __unicode__()
  261. 261. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  262. 262. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  263. 263. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  264. 264. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name
  265. 265. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name >>> Publisher.objects.all() [<Publisher: Apress>]
  266. 266. INSERT
  267. 267. INSERT o = Model(...) o.save()a) >>> p = Publisher( ... name=Apress, ... address=2855 Telegraph Avenue, ... city=Berkeley, ... state_province=CA, ... country=U.S.A., ... website=http://www.apress.com/) >>> p.save()
  268. 268. INSERT o = Model(...) o.save()a) >>> p = Publisher( ... name=Apress, ... address=2855 Telegraph Avenue, ... city=Berkeley, ... state_province=CA, ... country=U.S.A., ... website=http://www.apress.com/) >>> p.save() manager.create(...)b) >>> p = Publisher.objects.create( ... name=OReilly, ... address=10 Fawcett St., ... city=Cambridge, ... state_province=MA, ... country=U.S.A., ... website=http://www.oreilly.com/)
  269. 269. UPDATE
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×