Django: Disfruta programando.

13,345
-1

Published on

Curso de Python y Django impartido con Jaime Irurzun en los cursos de verano del e-ghost en la Universidad de Deusto, septiembre 2010.

Published in: Technology
4 Comments
10 Likes
Statistics
Notes
No Downloads
Views
Total Views
13,345
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
339
Comments
4
Likes
10
Embeds 0
No embeds

No notes for slide

Django: Disfruta programando.

  1. 1. Disfruta  programando. Jorge  Bas4da  [neo] Jaime  Irurzun  [etox]   neo2001@gmail.com jaime.irurzun@gmail.com @jorgebas4da @jaimeirurzun
  2. 2. Disfruta  programando.
  3. 3. Índice 1. 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. Índice 1. 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
  5. 5. • Legible Sintaxis  intui4va  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  par4es • Integrable C,  C++,  Java,  .NET,  COM,  WS,  CORBA,  ... • ...  y  Diver/do
  6. 6. Instalación $ sudo apt-get install python http://www.python.org/download/ Snow  Leopard  incluye  las  versiones  2.5.4  y  2.6.1
  7. 7. El  Intérprete
  8. 8. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py #!/usr/bin/env python hola mundo! print "hola mundo!" $
  9. 9. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py #!/usr/bin/env python hola mundo! print "hola mundo!" $ Modo  Interac4vo $ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print "hola mundo!" hola mundo!
  10. 10. Índice 1. 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
  11. 11. Tipos  de  datos object +  info:  hp://docs.python.org/library/stdtypes.html
  12. 12. Tipos  de  datos int 1234 long 35L float 3.1415 object +  info:  hp://docs.python.org/library/stdtypes.html
  13. 13. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False object +  info:  hp://docs.python.org/library/stdtypes.html
  14. 14. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object +  info:  hp://docs.python.org/library/stdtypes.html
  15. 15. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] +  info:  hp://docs.python.org/library/stdtypes.html
  16. 16. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] dict {'food': 'spam', 'taste': 'yum'} +  info:  hp://docs.python.org/library/stdtypes.html
  17. 17. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] dict {'food': 'spam', 'taste': 'yum'} tuple (1, 'spam', 4, 'U') +  info:  hp://docs.python.org/library/stdtypes.html
  18. 18. Tipos  de  datos o   ¡T i p ad mi co! int 1234 long 35L float d iná 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] dict {'food': 'spam', 'taste': 'yum'} tuple (1, 'spam', 4, 'U') +  info:  hp://docs.python.org/library/stdtypes.html
  19. 19. Índice 1. 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
  20. 20. Operadores +  info:  hp://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 +  info:  hp://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 > b comparadores a >= b a == b a != b +  info:  hp://docs.python.org/library/operator.html
  23. 23. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > b comparadores a >= b a == b a != b lógicos a or b a and b not a +  info:  hp://docs.python.org/library/operator.html
  24. 24. Índice 1. 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
  25. 25. Usos  frecuentes:  list
  26. 26. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1
  27. 27. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1 >>> 2 in nums True
  28. 28. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1 >>> 2 in nums True >>> nums.append(4) >>> print nums [1, 2, 3, 4]
  29. 29. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1 >>> 2 in nums True >>> nums.append(4) >>> print nums [1, 2, 3, 4] >>> nums.count() 4
  30. 30. Usos  frecuentes:  str
  31. 31. Usos  frecuentes:  str >>> "Python mola"[1:4] 'yth'
  32. 32. Usos  frecuentes:  str >>> "Python mola"[1:4] 'yth' >>> "Python mola".find("mola") 7
  33. 33. Usos  frecuentes:  str >>> "Python mola"[1:4] 'yth' >>> "Python mola".find("mola") 7 >>> "Python mola".replace("Python", "PHP no") 'PHP no 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']
  35. 35. 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"
  36. 36. Usos  frecuentes:  dict
  37. 37. Usos  frecuentes:  dict >>> user = {'nick': 'neo', 'age': 24} >>> user.keys() ['nick', 'age'] >>> user.values() ['neo', 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
  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
  40. 40. 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}
  41. 41. Usos  frecuentes:  str  %
  42. 42. Usos  frecuentes:  str  % >>> "%s es muy sabio" % "Hycker" 'Hycker es muy sabio'
  43. 43. Usos  frecuentes:  str  % >>> "%s es muy sabio" % "Hycker" 'Hycker es muy sabio' >>> "%s sabe %i idiomas" % ("Hycker", 5) 'Hycker sabe 5 idiomas'
  44. 44. 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 % v 'Hycker sabe 5 idiomas'
  45. 45. Módulos sound/ __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  conNene  un  fichero  con   ... filters/ __init__.py nombre  __init__.py equalizer.py vocoder.py karaoke.py ...
  46. 46. Módulos sound/ 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  conNene  un  fichero  con   ... filters/ __init__.py nombre  __init__.py equalizer.py vocoder.py karaoke.py ...
  47. 47. Módulos import math ¿Dónde  los  busca  Python? En  la  lista  de  directorios  que  conNene  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/
  48. 48. Módulos sound/ 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 ...
  49. 49. Módulos sound/ 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 ...
  50. 50. Módulos sound/ 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 ...
  51. 51. Módulos sound/ 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 ...
  52. 52. Módulos sound/ 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(...)
  53. 53. Índice 1. 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
  54. 54. Estructuras {}
  55. 55. Estructuras {}
  56. 56. Identación >>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance
  57. 57. Identación >>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance PEP 8 4  Espacios  para  indicar  la  identación
  58. 58. ¿PEP  8? PEP 8 •  Guido  van  Rossum  (2001) •  Recomendaciones  de  esNlo •  “Readability  counts” •  “Code  is  read  much  more  oZen  than  it  is  wrien.” •  Muy  recomendable  importante  seguirlo. hp://www.python.org/dev/peps/pep-­‐0008/
  59. 59. Funciones def my_first_function(p1, p2): return "Hello World!"
  60. 60. Funciones 1 def my_first_function(p1, p2): return "Hello World!"
  61. 61. Funciones 2 1 def my_first_function(p1, p2): return "Hello World!"
  62. 62. Funciones 2 1 def my_first_function(p1, p2): 3 return "Hello World!"
  63. 63. Funciones 2 1 def my_first_function(p1, p2): 3 return "Hello World!" PEP 8 Recomendaciones: •  Minúsculas •  Palabras  separadas  por  _ •  Evitar  camelCase
  64. 64. Conversión  de  /pos +info:  hp://docs.python.org/library/func4ons.html
  65. 65. Conversión  de  /pos >>> int(1.3) 1 +info:  hp://docs.python.org/library/func4ons.html
  66. 66. Conversión  de  /pos >>> int(1.3) 1 >>> str(2) '2' +info:  hp://docs.python.org/library/func4ons.html
  67. 67. Conversión  de  /pos >>> int(1.3) 1 >>> str(2) '2' >>> float(1) 1.0 +info:  hp://docs.python.org/library/func4ons.html
  68. 68. Conversión  de  /pos >>> int(1.3) 1 >>> tuple([1,2,3]) (1, 2, 3) >>> str(2) '2' >>> float(1) 1.0 +info:  hp://docs.python.org/library/func4ons.html
  69. 69. 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:  hp://docs.python.org/library/func4ons.html
  70. 70. Funciones  comunes +info:  hp://docs.python.org/library/func4ons.html
  71. 71. Funciones  comunes >>> len("Python Mola") 11 >>> len([1,2,3,4]) 4 +info:  hp://docs.python.org/library/func4ons.html
  72. 72. 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:  hp://docs.python.org/library/func4ons.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) [0, 1, 2, 3, 4] >>> range(1,7) [1, 2, 3, 4, 5, 6] >>> range(1,7,2) [1, 3, 5] +info:  hp://docs.python.org/library/func4ons.html
  74. 74. 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:  hp://docs.python.org/library/func4ons.html
  75. 75. Funciones  interesantes Son  sólo  un  ejemplo... +info:  hp://docs.python.org/library/func4ons.html
  76. 76. 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:  hp://docs.python.org/library/func4ons.html
  77. 77. 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:  hp://docs.python.org/library/func4ons.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]) [1, 2, 3, 4, 5] Son  sólo  un  ejemplo... +info:  hp://docs.python.org/library/func4ons.html
  79. 79. 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:  hp://docs.python.org/library/func4ons.html
  80. 80. Funciones  de  ayuda
  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']
  82. 82. 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)
  83. 83. Clases class 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 class 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 2 class 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)
  86. 86. Clases 1 2 class 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)
  87. 87. Clases 1 2 class 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)
  88. 88. Clases 1 2 class 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)
  89. 89. Clases 1 2 class 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
  90. 90. El  operador  () • Es  importante  diferenciar: funcion      vs      funcion() Clase              vs        Clase() • El  operador  ()  permite: • Invocar  funciones: resultado = funcion() • Instanciar  clases: objeto = Clase("param1")
  91. 91. Índice 1. 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
  92. 92. 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?" }
  93. 93. Sentencias:  while $count = 0; while ($count < 5) { echo "Number ".$count; $count+=1; } count = 0 while count < 5: print "Number %i" % count count+=1
  94. 94. Sentencias:  for for ($i=0; $i < 5; $i++) { echo "Number ".$count; } for i in range(4): print "Number %i" % count
  95. 95. Sentencias:  try-­‐except try { $result = 3 / 0; } catch (Exception $e) { echo "Division by Zero" } try: result = 3 / 0 except: print "Division by Zero"
  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. •  ProtoNpado...  UNlizado  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. •  ProtoNpado...  UNlizado  por  grandes  empresas. etc...
  98. 98. Ejemplo  &  Ejercicio
  99. 99. Índice 1. 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  Web 1ª  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  beer  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. hp://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  SGBD Configurar  un  motor  de  Base  de  Datos: •  Oficiales:   •  Comunidad:   •  PostgreSQL •  Sybase  SQL  Anywhere •  MySQL •  IBM  DB2 •  MicrosoZ  SQL  Server  2005 •  Oracle •  Firebird •  SQLite •  ODBC
  114. 114. 2.  Instalación  SGBD Configurar  un  motor  de  Base  de  Datos: •  Oficiales:   •  Comunidad:   •  PostgreSQL •  Sybase  SQL  Anywhere •  MySQL •  IBM  DB2 •  MicrosoZ  SQL  Server  2005 •  Oracle •  Firebird •  SQLite •  ODBC
  115. 115. 2.  Instalación  SGBD •  Vamos  a  uNlizar  SQLite  por  comodidad •  Desde  Python  2.5  podemos  uNlizar  sqlite    sin  instalar  nada.
  116. 116. 2.  Instalación  SGBD •  Vamos  a  uNlizar  SQLite  por  comodidad •  Desde  Python  2.5  podemos  uNlizar  sqlite    sin  instalar  nada.
  117. 117. 3.  Instalación  Django A:  Paquetes  de  cada  distro • apt-get install python-django B:  Official  Release • hp://www.djangoproject.com/download/ • python setup.py install C:  Trunk • hp://code.djangoproject.com/svn/django/trunk/
  118. 118. All  Right?
  119. 119. All  Right? >>> import django >>> django.VERSION (1, 1, 0, 'final', 0) >>> import django Traceback (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? Ficheros Carpetas *  Incluida  la  carpeta  del  proyecto
  123. 123. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony Ficheros 149 117 Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  124. 124. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony Ficheros 149 117 Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  125. 125. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony Django Ficheros 149 117 4 Carpetas 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.py startproject dwitter
  129. 129. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin.py startproject dwitter __init__.py manage.py settings.py urls.py
  130. 130. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin.py 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.py 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. senngs.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. Índice 1. 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  Django Modelo  =  Model Vista  =  Template Controlador  =  URL+View
  138. 138. URLs  y  Vistas • El  fichero  urls.py  actúa  como  puerta  de  entrada  para  las   pe4ciones  HTTP • Se  definen  URLs  elegantes  mediante  expresiones  regulares   que  redirigen  a  funciones  de  views.py hp://mysite.com/about/ urls.py ¿urlpaerns? 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 datetime views.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. Índice 1. 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  4pos  de  objetos:  Template()  y  Context(). • Un  objeto  Template()  con4ene  el  string  de  salida  que   queremos  devolver  en  el  HpResponse  (normalmente   HTML),  pero  incluyendo  e4quetas  especiales  de  Django. • Un  objeto  Context()  con4ene  un  diccionario  con  los   valores  que  dan  contexto  a  una  plan4lla,  los  que  deben   usarse  para  renderizar  un  objeto  Template(). Template: "Bienvenido, {{ user }}." "Bienvenido, alatar." Context: {'user': 'alatar'}
  147. 147. Templates • Primera  aproximación  al  obje4vo:  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  obje4vo:  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  obje4vo:  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  obje4vo:  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  obje4vo:  get_template() TEMPLATE_DIRS = ( sezngs.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  obje4vo:  get_template() TEMPLATE_DIRS = ( sezngs.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  obje4vo:  get_template() TEMPLATE_DIRS = ( sezngs.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): S4ll   now = datetime.now() t = get_template('hora.html') c = Context({'hora': now}) html = t.render(c) boring... return HttpResponse(html)
  154. 154. Templates • Obje4vo  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 • Obje4vo  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 • Obje4vo  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) sezngs.py '/home/django/templates', )
  158. 158. Templates:  Tip TEMPLATE_DIRS = ( Reusa ble   a) sezngs.py '/home/django/templates', ) apps?
  159. 159. Templates:  Tip TEMPLATE_DIRS = ( Reusa ble   a) sezngs.py '/home/django/templates', ) apps? b) Alterna4va  reu4lizable: TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', ) • 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  dwier.website. b) Incluir  la  app  en  senngs.py. c) Definir  URLs  en  urls.py: ‣ user/<username>/status/<tweet_id>/ ‣ user/<username>/follow/ ‣ user/<username>/unfollow/ ‣ user/<username>/ ‣ search/ ‣ users/ d) Crear  una  vista  para  “/”  que  renderice   un  Nmeline  de  twier  en  una  template   index.html  a  parNr  de  datos   hardcodeados  en  un  diccionario. ¡Empieza  nuestro  primer  proyecto!
  161. 161. 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
  162. 162. 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.
  163. 163. Templates:  {{}} <html> <head>Ejemplo templates</head> <body> Hola, {{ username }}. </body> </html> {'username': 'juan'} <html> <head>Ejemplo templates</head> <body> Hola, juan. </body> </html>
  164. 164. Filters  y  Tags
  165. 165. Filters  y  Tags
  166. 166. Filters  y  Tags filter {{ varible|filter }}
  167. 167. Filters  y  Tags filter {{ varible|filter }} inline  tag {% tag var1 var2 %}
  168. 168. Filters  y  Tags filter {{ varible|filter }} inline  tag {% tag var1 var2 %} block  tag {% tag var1 %} ... {% endtag %}
  169. 169. Templates:  tags  {%  %}
  170. 170. Templates:  tags  {%  %} comment {% comment %} Bu! {% endcomment %}
  171. 171. Templates:  tags  {%  %} comment {% comment %} Bu! {% endcomment %} for {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %}
  172. 172. 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 %}
  173. 173. Tarea  1:  Tags a) UNlizar  tags  para  que  el  Nmeline  se   muestre  con  el  siguiente  formato: • <username>:  <tweet> • <username>:  <tweet> • ...  
  174. 174. 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>
  175. 175. Templates:  Filters
  176. 176. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12
  177. 177. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo
  178. 178. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo
  179. 179. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo wordcount {{ username|wordcount }} 3
  180. 180. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo wordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO
  181. 181. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo wordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO {'username': None} default {{ username|default:”Desconocido” }} Desconocido
  182. 182. Templates:  Filters
  183. 183. Templates:  Filters {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'} striptags {{ username|striptags }} Juan es majo guapo y listo
  184. 184. Templates:  Filters {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'} striptags {{ username|striptags }} Juan es majo guapo y listo truncatewords_html {{ username|truncatewords_html:4 }} Juan es <b>majo guapo</b> ...
  185. 185. Templates:  Filters {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'} striptags {{ username|striptags }} Juan es majo guapo y listo truncatewords_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>
  186. 186. Templates:  Filters
  187. 187. Templates:  Filters {'url': 'Visitad http://www.djangoproject.com'} urlize {{ url|urlize }} Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a>
  188. 188. 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>
  189. 189. Templates:  Filters {'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
  190. 190. 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>
  191. 191. Templates:  Filters
  192. 192. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790
  193. 193. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ value|filesizeformat }} 117.7MB
  194. 194. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ value|filesizeformat }} 117.7MB {'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010
  195. 195. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ 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
  196. 196. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ 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
  197. 197. Tarea  2:  Filters a) Añadir  a  cada  tweet  del  Nmeline  el   Nempo  transcurrido: • <username>:  <tweet> <n>  seconds  ago • <username>:  <tweet> <n>  minutes  ago • ...  
  198. 198. Templates:  tags  {%  %}
  199. 199. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li> {% endfor %}
  200. 200. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li> {% endfor %} include {% include "foo/bar.html" %}
  201. 201. 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 %}
  202. 202. 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 %}
  203. 203. Tarea  3:  Tags  avanzados a) Hacer  que  el  Nmeline  muestre  el   mensaje  “No  hay  tweets.”  si  el   diccionario  recibido  está  vacío.  
  204. 204. extend  y  block base.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 %}
  205. 205. 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  exNenda  el  bloque   ‘content’  con  su  contenido.  
  206. 206. Índice 1. 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
  207. 207. Modelos
  208. 208. ¿SQL?
  209. 209. Ejemplo  SQL def 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})
  210. 210. Ejemplo  SQL def 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})
  211. 211. Ejemplo  SQL def 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})
  212. 212. Ejemplo  SQL def 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})
  213. 213. Ejemplo  SQL def 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})
  214. 214. Ejemplo  SQL def 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})
  215. 215. Ejemplo  SQL def 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})
  216. 216. 12  lineas  de  Python...  ¬_¬
  217. 217. ORM  (Object-­‐RelaNonal  mapping)
  218. 218. ORM  (Object-­‐RelaNonal  mapping)
  219. 219. Ejemplo  ORM def book_list(request): names = Books.objects.all().order_by('name') return render_to_response('book_list.html', {'names':names})
  220. 220. Ejemplo  ORM def book_list(request): 1 names = Books.objects.all().order_by('name') return render_to_response('book_list.html', {'names':names})
  221. 221. Ejemplo  ORM def book_list(request): 1 names = Books.objects.all().order_by('name') 2 return render_to_response('book_list.html', {'names':names})
  222. 222. Fucking  Ninjas!
  223. 223. 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)  
  224. 224. 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)  
  225. 225. Modelo from django.db import models 1 2 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)  
  226. 226. Modelo from django.db import models 1 3 2 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)  
  227. 227. Modelo from django.db import models 1 3 2 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)  
  228. 228. Modelo from django.db import models 1 3 2 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)  
  229. 229. Modelo from django.db import models 1 3 2 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)  
  230. 230. Fucking  Awesome  Ninjas!
  231. 231. 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
  232. 232. 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
  233. 233. 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)
  234. 234. 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)
  235. 235. ¿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;
  236. 236. ¿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;
  237. 237. ¿Es  magia?  No. •  Nombres  de  tablas  generados  automáNcamente. •  <app_name>_lower(<model_name>) •  id  como  Primary  Key  (Personalizable) •  Las  Foreing  Key  terminan  en  _id  (Personalizable) •  Los  Npos  de  datos  se  ajustan  en  función  del  SGBD
  238. 238. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'db.sqlite' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = ''
  239. 239. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' 1 DATABASE_NAME = 'db.sqlite' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = ''
  240. 240. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' 1 DATABASE_NAME = 'db.sqlite' 2 DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = ''
  241. 241. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' 1 DATABASE_NAME = 'db.sqlite' 2 DATABASE_USER = '' DATABASE_PASSWORD = '' 3 DATABASE_HOST = '' DATABASE_PORT = ''
  242. 242. Creando  Tablas •  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  senngs.py •  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  243. 243. Creando  Tablas $ python manage.py syncdb •  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  senngs.py •  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  244. 244. a) Crear  modelo  Tweet b)Configurar  senngs.py c) Ver  el  SQL  generado  con  sqlall Nuestro  primer  modelo
  245. 245. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  246. 246. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user django.contrib.auth Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  247. 247. ¿Cuantos  sistemas  de  AutenNcación  habéis  programado?
  248. 248. ¿Alguno  era  mejor  que  el  anterior?  ;-­‐)
  249. 249. contrib.auth  puede  ser  el  úlNmo  :D
  250. 250. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet website.tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  251. 251. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin django.contrib.auth E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  252. 252. BD  Lista  para  usarse
  253. 253. BD  Lista  para  usarse
  254. 254. a) Hacer  syncdb Nuestro  primer  modelo
  255. 255. Previo:  Clases  del  ORM ts = Publisher.objects.all() Model Manager QuerySet
  256. 256. Previo:  __unicode__()
  257. 257. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  258. 258. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  259. 259. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  260. 260. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name
  261. 261. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name >>> Publisher.objects.all() [<Publisher: Apress>]
  262. 262. INSERT
  263. 263. 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()
  264. 264. 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='O'Reilly', ... address='10 Fawcett St.', ... city='Cambridge', ... state_province='MA', ... country='U.S.A.', ... website='http://www.oreilly.com/')
  265. 265. UPDATE
  266. 266. UPDATE o.save() >>> ... >>> p.id 1 52 >>> p.name = 'Apress Publishing' >>> p.save()
  267. 267. UPDATE o.save() >>> ... >>> p.id 1 52 >>> p.name = 'Apress Publishing' >>> p.save() queryset.update(...) n >>> Publisher.objects.all().update(country='USA') 2
  268. 268. DELETE
  269. 269. DELETE o.delete() >>> ... >>> p.id 1 52 >>> p.delete()
  270. 270. DELETE o.delete() >>> ... >>> p.id 1 52 >>> p.delete() queryset.delete() >>> ps = Publisher.objects.all() n >>> ps.delete()
  271. 271. SELECT  de  1  resultado
  272. 272. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress>
  273. 273. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress> >>> Publisher.objects.get(name="Anaya") Traceback (most recent call last): ... DoesNotExist: Publisher matching query does not exist.
  274. 274. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress> >>> Publisher.objects.get(name="Anaya") Traceback (most recent call last): ... DoesNotExist: Publisher matching query does not exist. >>> Publisher.objects.get(country="U.S.A.") Traceback (most recent call last): ... MultipleObjectsReturned: get() returned more than one Publisher -- it returned 2! Lookup parameters were {'country': 'U.S.A.'}
  275. 275. SELECT  de  N  resultados
  276. 276. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>]
  277. 277. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>]
  278. 278. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>] .exclude(...) >>> Publisher.objects.exclude( country="U.S.A.", state_province="CA") [<Publisher: O'Reilly>]
  279. 279. SELECT  de  N  resultadosen   evuelv ¡D s,  no   .all() uery Set Q li stas! >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>] .exclude(...) >>> Publisher.objects.exclude( country="U.S.A.", state_province="CA") [<Publisher: O'Reilly>]
  280. 280. get(),  filter()  y  exclude()
  281. 281. get(),  filter()  y  exclude() Modelo.objects.filter(campo1="valor1", campo2="valor2") Los  parámetros  pueden  indicar  mucho  más  que  igualdad  (=)
  282. 282. get(),  filter()  y  exclude() Modelo.objects.filter(campo1="valor1", campo2="valor2") Los  parámetros  pueden  indicar  mucho  más  que  igualdad  (=) campo__exact='' campo__gt=0 campo__startswith='' campo__iexact='' campo__gte=0 campo__istartswith='' campo__contains='' campo__lt=0 campo__endswith='' campo__icontains='' campo__lte=0 campo__iendswith='' campo__isnull=T|F campo__in=[ ,] campo__range=( ,) campo__day=31 campo__month=12 campo__year=2010
  283. 283. ORDER  BY
  284. 284. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>]
  285. 285. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>]
  286. 286. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>] MúlNples  campos: >>> Publisher.objects.order_by("-name", "country") [<Publisher: O'Reilly>, <Publisher: Apress>]
  287. 287. ORDER  BY ¡También   devu elve   .order_by(...) uer y Sets! Q >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>] MúlNples  campos: >>> Publisher.objects.order_by("-name", "country") [<Publisher: O'Reilly>, <Publisher: Apress>]
  288. 288. Slicing
  289. 289. Slicing [n:m] >>> Publisher.objects.order_by("name")[0] <Publisher: Apress> >>> Publisher.objects.order_by("name")[:2] [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("name")[1:2] [<Publisher: O'Reilly>]
  1. A particular slide catching your eye?

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

×