You are on page 1of 448

ulsfruLa programando.

!orge 8asuda [neo]


neo2001[gmall.com
!alme lrurzun [eLox]
[alme.lrurzun[gmall.com
[[orgebasuda [[almelrurzun
ulsfruLa programando.
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
-
Leg|b|e
-
roducnvo
-
ortab|e
-
Lxtenso
-
Integrab|e
.
... y D|verndo
SlnLaxls lnLuluva y esLrlcLa
LnLre 1/3 y 1/3 ms conclso que !ava o C++
Cnu/Llnux, Wlndows, Mac CS x, ...
SLandard Llbrary, 1hlrd parues
C, C++, !ava, .nL1, CCM, WS, CC88A, ...
Insta|ac|n
$ sudo apt-get install python
http://www.python.org/download/
Snow Leopard lncluye las verslones 2.5.4 y 2.6.1
L| Intrprete
L| Intrprete
$ python holamundo.py
hola mundo!
$
Modo 8aLch
#!/usr/bin/env python
print "hola mundo!"
holamundo.py
L| Intrprete
$ 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!
Modo lnLeracuvo
$ python holamundo.py
hola mundo!
$
Modo 8aLch
#!/usr/bin/env python
print "hola mundo!"
holamundo.py
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
True False
bool
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
True False
bool
'spam' "guido's" """n lines""" sLr
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
True False
bool
'spam' "guido's" """n lines""" sLr
[1, [2, 'three'], 4] llsL
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
True False
bool
'spam' "guido's" """n lines""" sLr
[1, [2, 'three'], 4] llsL
{'food': 'spam', 'taste': 'yum'} dlcL
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
True False
bool
'spam' "guido's" """n lines""" sLr
[1, [2, 'three'], 4] llsL
{'food': 'spam', 'taste': 'yum'} dlcL
(1, 'spam', 4, 'U') Luple
1|pos de datos
+ lnfo: hup://docs.pyLhon.org/llbrary/sLdLypes.hLml
ob[ect
1234 3.1415
lnL oaL
35L
long
True False
bool
'spam' "guido's" """n lines""" sLr
[1, [2, 'three'], 4] llsL
{'food': 'spam', 'taste': 'yum'} dlcL
(1, 'spam', 4, 'U') Luple
}
1
l
p
a
d
o

d
l
n

m
l
c
o
!
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
Cperadores
+ lnfo: hup://docs.pyLhon.org/llbrary/operaLor.hLml
Cperadores
+ lnfo: hup://docs.pyLhon.org/llbrary/operaLor.hLml
numerlcos
a + b a - b a * b a / b
a % b -a +a a ** b
Cperadores
+ lnfo: hup://docs.pyLhon.org/llbrary/operaLor.hLml
numerlcos
a + b a - b a * b a / b
a % b -a +a a ** b
comparadores
a < b a <= b a > b
a >= b a == b a != b
Cperadores
+ lnfo: hup://docs.pyLhon.org/llbrary/operaLor.hLml
numerlcos
a + b a - b a * b a / b
a % b -a +a a ** b
comparadores
a < b a <= b a > b
a >= b a == b a != b
lglcos
a or b a and b not a
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
Usos frecuentes: ||st
Usos frecuentes: ||st
>>> nums = [1, 2, 3]
>>> nums[0]
1
Usos frecuentes: ||st
>>> nums = [1, 2, 3]
>>> nums[0]
1
>>> 2 in nums
True
Usos frecuentes: ||st
>>> nums = [1, 2, 3]
>>> nums[0]
1
>>> nums.append(4)
>>> print nums
[1, 2, 3, 4]
>>> 2 in nums
True
Usos frecuentes: ||st
>>> nums = [1, 2, 3]
>>> nums[0]
1
>>> nums.append(4)
>>> print nums
[1, 2, 3, 4]
>>> 2 in nums
True
>>> nums.count()
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 no")
'PHP no mola'
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']
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"
Usos frecuentes: d|ct
Usos frecuentes: d|ct
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo', 24]
Usos frecuentes: d|ct
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo', 24]
>>> user['age']
24
>>> user.get('age', 20)
24
Usos frecuentes: d|ct
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo', 24]
>>> user['age']
24
>>> user.get('age', 20)
24
>>> user.has_key('nick')
True
Usos frecuentes: d|ct
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo', 24]
>>> user['age']
24
>>> user.get('age', 20)
24
>>> user.has_key('nick')
True
>>> user.update({'nick': 'alatar', 'age': 25})
>>> user
{'nick': 'alatar', 'age': 25}
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)
'Hycker sabe 5 idiomas'
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'
sound/
__init__.py
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
...
Mdu|os
1. un mdu|o es un chero .py
2. Los mdulos pueden
organlzarse en paqueLes.
3. un paquete es una carpeLa
que conuene un chero con
nombre __|n|t__.py
sound/
__init__.py
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
...
Mdu|os
1. un mdu|o es un chero .py
2. Los mdulos pueden
organlzarse en paqueLes.
3. un paquete es una carpeLa
que conuene un chero con
nombre __|n|t__.py
1
2
3
Mdu|os
Ln la llsLa de dlrecLorlos que conuene la llsLa sys.path:
import math
unde los busca yLhon?
1. Ll dlrecLorlo actua|:
2. Ll dlrecLorlo site-packages de nuesLro yLhon:
3. Los dlrecLorlos apunLados por PYTHONPATH:
4. Ll dlrecLorlo de la lnsLalacln de ython:
./
/usr/local/lib/python2.6/site-packages
/usr/lib/python2.6/
$ env | grep PYTHONPATH
Mdu|os
sound/
__init__.py
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
...
import sound.effects.echo
sound.effects.echo.echofilter(...)
Mdu|os
sound/
__init__.py
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
...
import sound.effects.echo
sound.effects.echo.echofilter(...)
from sound.effects import echo
echo.echofilter(...)
Mdu|os
sound/
__init__.py
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
...
import sound.effects.echo
sound.effects.echo.echofilter(...)
from sound.effects import echo
echo.echofilter(...)
from sound.effects.echo import echofilter
echofilter(...)
Mdu|os
sound/
__init__.py
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
...
import sound.effects.echo
sound.effects.echo.echofilter(...)
from sound.effects import echo
echo.echofilter(...)
from sound.effects.echo import echofilter
echofilter(...)
from sound.effects.echo import *
echofilter(...)
Mdu|os
sound/
__init__.py
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
...
import sound.effects.echo
sound.effects.echo.echofilter(...)
from sound.effects import echo
echo.echofilter(...)
from sound.effects.echo import echofilter
echofilter(...)
from sound.effects.echo import *
echofilter(...)
from sound.effects import echo as rev
rev.echofilter(...)
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
[}
Lstructuras
[}
Lstructuras
>>> from __future__ import braces
File "<stdin>", line 1
SyntaxError: not a chance
Identac|n
>>> from __future__ import braces
File "<stdin>", line 1
SyntaxError: not a chance
4 Lspaclos para lndlcar la ldenLacln
PEP 8
Identac|n
hup://www.pyLhon.org/dev/peps/pep-0008/
-
Culdo van 8ossum (2001)
-
8ecomendaclones de esulo
-
8eadablllLy counLs"
-
Code ls read much more oen Lhan lL ls wrluen."
-
Muy recomendable lmporLanLe segulrlo.
PEP 8
jL 8?
def my_first_function(p1, p2):
return "Hello World!"
Iunc|ones
def my_first_function(p1, p2):
return "Hello World!"
1
Iunc|ones
def my_first_function(p1, p2):
return "Hello World!"
1
2
Iunc|ones
def my_first_function(p1, p2):
return "Hello World!"
1
2
3
Iunc|ones
def my_first_function(p1, p2):
return "Hello World!"
8ecomendaclones:
-
Mlnusculas
-
alabras separadas por _
-
LvlLar camelCase
1
2
3
PEP 8
Iunc|ones
Convers|n de npos
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Convers|n de npos
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
>>> int(1.3)
1
Convers|n de npos
>>> str(2)
'2'
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
>>> int(1.3)
1
Convers|n de npos
>>> str(2)
'2'
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
>>> int(1.3)
1
>>> float(1)
1.0
Convers|n de npos
>>> str(2)
'2'
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
>>> int(1.3)
1
>>> float(1)
1.0
>>> tuple([1,2,3])
(1, 2, 3)
Convers|n de npos
>>> str(2)
'2'
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
>>> int(1.3)
1
>>> float(1)
1.0
>>> list((1,2,3))
[1, 2, 3]
>>> tuple([1,2,3])
(1, 2, 3)
Iunc|ones comunes
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones comunes
>>> len("Python Mola")
11
>>> len([1,2,3,4])
4
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones 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]
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones 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]
>>> type(True)
<type 'bool'>
>>> type("Python Mola")
<type 'str'>
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones 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]
>>> sum([0,1,2,3,4])
10
>>> sum(range(5))
10
>>> type(True)
<type 'bool'>
>>> type("Python Mola")
<type 'str'>
un muy |argo etc...
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones |nteresantes
Son s|o un e[emp|o...
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones |nteresantes
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
Son s|o un e[emp|o...
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones |nteresantes
>>> 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|o un e[emp|o...
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones |nteresantes
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> round(1.2345,2)
1.23
>>> sorted([5,1,3,4,2])
[1, 2, 3, 4, 5]
Son s|o un e[emp|o...
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones |nteresantes
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> round(1.2345,2)
1.23
>>> sorted([5,1,3,4,2])
[1, 2, 3, 4, 5]
>>> map(str,[1,2,3,4,5])
['1', '2', '3', '4', '5']
Son s|o un e[emp|o...
+lnfo: hup://docs.pyLhon.org/llbrary/funcuons.hLml
Iunc|ones de ayuda
Iunc|ones 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']
Iunc|ones 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)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
C|ases
s = Student("Jorge", 24)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
1
C|ases
s = Student("Jorge", 24)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
1 2
C|ases
s = Student("Jorge", 24)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
1 2
3
C|ases
s = Student("Jorge", 24)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
1 2
3
4
C|ases
s = Student("Jorge", 24)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
1 2
3
4
5
C|ases
s = Student("Jorge", 24)
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age

def hello(self):
return 'My name is %s' % self.name
1 2
3
4
5
8ecomendaclones:
-
CamelCase
PEP 8
C|ases
s = Student("Jorge", 24)
L| operador ()
-
Ls lmporLanLe dlferenclar:
funcion vs funcion()
Clase vs Clase()
-
Ll operador () permlLe:
-
Invocar funclones:
-
Instanc|ar clases:
resultado = funcion()
objeto = Clase("param1")
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
$name = "Jon";
if($name == "Jon"){
$name = "Jon Rocks!";
}
elseif($name == "Mary"){
$name = "Hello Mary";
}
else{
$name = "Who are you?"
}
name = "Jon"
if name == "Jon":
name = "Jon Rocks!"
elif name == "Mary":
name = "Hello Mary"
else:
name = "Who are you?"
Sentenc|as: |f-e|se
$count = 0;
while ($count < 5) {
echo "Number ".$count;
$count+=1;
}
count = 0
while count < 5:
print "Number %i" % count
count+=1
Sentenc|as: wh||e
for ($i=0; $i < 5; $i++) {
echo "Number ".$count;
}
for i in range(4):
print "Number %i" % count
Sentenc|as: for
try {
$result = 3 / 0;
} catch (Exception $e) {
echo "Division by Zero"
}
try:
result = 3 / 0
except:
print "Division by Zero"
Sentenc|as: try-except
-
yLhon es un lengua[e fcll de aprender.
-
Menos cdlgo:
-
Muchos Muchlslmos menos errores de SlnLaxls.
-
Mayor velocldad de escrlLura.
-
roLoupado... uullzado por grandes empresas.
Conc|us|ones
-
yLhon es un lengua[e fcll de aprender.
-
Menos cdlgo:
-
Muchos Muchlslmos menos errores de SlnLaxls.
-
Mayor velocldad de escrlLura.
-
roLoupado... uullzado por grandes empresas.
eLc...
Conc|us|ones
L[emplo & L[erclclo
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
Lvo|uc|n de |a Web
uesarrollo Web
1 Ceneracln 2 Ceneracln 3 Ceneracln
P1ML
CCl
P
AS
!S
...
D[ango
8alls
Symfony
...
Irameworks web
D[ango: u y dnde
-
Loose coupllng, AcoplamlenLo debll.
-
Cada capa es lndependlenLe y desconoce compleLamenLe
a las dems.
-
Menos cdlgo.
-
8pldo desarrollo.
-
LsLo es el slglo 21, Lodo el Lraba[o Ledloso hay que evlLarlo.
-
uon'L 8epeaL ?ourself (u8?)
I||osoha
-
Loose coupllng, AcoplamlenLo debll.
-
Cada capa es lndependlenLe y desconoce compleLamenLe
a las dems.
-
Menos cdlgo.
-
8pldo desarrollo.
-
LsLo es el slglo 21, Lodo el Lraba[o Ledloso hay que evlLarlo.
-
uon'L 8epeaL ?ourself (u8?)
Every distinct concept and/or piece of data should live in
one, and only one, place. Redundancy is bad.
Normalization is good.

I||osoha
-
LxpllclL ls beuer Lhan lmpllclL.
-
LsLe es un prlnclplo de yLhon.
-
u[ango no debe hacer demaslada Magla".
-
Sl algo es Mglco" ha de haber una buena razn.
-
ConslsLencla
-
Pa de ser conslsLenLe a Lodos los nlveles.
-
Lclencla, Segurldad, llexlbllldad y Slmpllcldad.
hup://docs.d[angopro[ecL.com/en/dev/mlsc/deslgn-phllosophles/
I||osoha
La comun|dad
La comun|dad
.
d[ango-users
18.000 mlembros
La comun|dad
.
d[ango-users
18.000 mlembros
.
d[ango-deve|opers
3.900 mlembros
La comun|dad
.
d[ango-users
18.000 mlembros
.
d[ango-deve|opers
3.900 mlembros
.
d[angopro[ect.com
300.000 vlslLas unlcas mensuales
ju|n usa D[ango?
eLc...
ju|n usa D[ango?
1. Insta|ac|n ython
$ sudo apt-get install python
http://www.python.org/download/
Snow Leopard lncluye las verslones 2.5.4 y 2.6.1
Congurar un moLor de 8ase de uaLos:
-
Cclales:
-
osLgreSCL
-
MySCL
-
Cracle
-
SL|te
-
Comunldad:
-
Sybase SCL Anywhere
-
l8M u82
-
Mlcroso SCL Server 2003
-
llreblrd
-
Cu8C
2. Insta|ac|n SG8D
Congurar un moLor de 8ase de uaLos:
-
Cclales:
-
osLgreSCL
-
MySCL
-
Cracle
-
SL|te
-
Comunldad:
-
Sybase SCL Anywhere
-
l8M u82
-
Mlcroso SCL Server 2003
-
llreblrd
-
Cu8C
2. Insta|ac|n SG8D
-
vamos a uullzar SL|te por comodldad
-
uesde yLhon 2.3 podemos uullzar sqllLe sln lnsLalar nada.
2. Insta|ac|n SG8D
-
vamos a uullzar SL|te por comodldad
-
uesde yLhon 2.3 podemos uullzar sqllLe sln lnsLalar nada.
2. Insta|ac|n SG8D
A: aqueLes de cada dlsLro

apt-get install python-django


8: Cmclal 8elease
-
hup://www.d[angopro[ecL.com/download/

python setup.py install


C: 1runk
-
hup://code.d[angopro[ecL.com/svn/d[ango/Lrunk/
3. Insta|ac|n D[ango
A|| k|ght?
A|| k|ght?
>>> 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
8lenvenldos al mundo de Cz
* lnclulda la carpeLa del proyecLo
I|cheros y Carpetas
jLs D[ango tn s|mp|e y fc|| de usar?
* lnclulda la carpeLa del proyecLo
I|cheros y Carpetas
llcheros
CarpeLas
jLs D[ango tn s|mp|e y fc|| de usar?
8alls Symfony
149 117
33 29
* lnclulda la carpeLa del proyecLo
I|cheros y Carpetas
llcheros
CarpeLas
jLs D[ango tn s|mp|e y fc|| de usar?
8alls Symfony
149 117
33 29
* lnclulda la carpeLa del proyecLo
I|cheros y Carpetas
llcheros
CarpeLas
jLs D[ango tn s|mp|e y fc|| de usar?
8alls Symfony
149 117
33 29
* lnclulda la carpeLa del proyecLo
I|cheros y Carpetas
u[ango
4
1
llcheros
CarpeLas
jLs D[ango tn s|mp|e y fc|| de usar?
Let's en[oy
Crear nuestro proyecto
de 4 hcheros ,-)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
de 4 hcheros ,-)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
__init__.py
manage.py
settings.py
urls.py
de 4 hcheros ,-)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
- LsLo es un proyecLo... ? S| os ve m| [efe...
__init__.py
manage.py
settings.py
urls.py
de 4 hcheros ,-)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
- LsLo es un proyecLo... ? S| os ve m| [efe...
__init__.py
manage.py
settings.py
urls.py
- S|, dlsponemos de un proyecLo '!"#$%&#'(' en d[ango.
de 4 hcheros ,-)
semngs.py
Arrancar nuestro proyecto
de 4 hcheros ,-)
Arrancar nuestro proyecto
de 4 hcheros ,-)
$ 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.
Arrancar nuestro proyecto
de 4 hcheros ,-)
$ 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.
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
MVC en D[ango
Modelo = Mode| VlsLa = 1emp|ate ConLrolador = UkL+V|ew
UkLs y V|stas
-
Ll chero ur|s.py acLua como puerLa de enLrada para las
peuclones P11
-
Se denen u8Ls eleganLes medlanLe expreslones regulares
que redlrlgen a funclones de v|ews.py
urls.py
vlews.py
hup://myslLe.com/abouL/
hLml
...
urlpauerns?
UkLs y V|stas
-
La funcln de vlews.py reclbe como parmeLros un ob[eLo
nupkequest y Lodos los parmeLros de la u8L capLurados,
Lenlendo que devolver slempre un ob[eLo nupkesponse
vlews.py
nupkequest(), ...
nupkesponse()
UkLs y V|stas
L[emp|o 1: http://mysite.com/time
from django.conf.urls.defaults import *
from mysite.views import hora_actual
urlpatterns = patterns('',
(r'^time/$', hora_actual),
)
from django.http import HttpResponse
from datetime import datetime
def hora_actual(request):
now = datetime.now()
html = "Son las %s." % now
return HttpResponse(html)
urls.py
vlews.py
UkLs y V|stas
from django.conf.urls.defaults import *
from mysite.views import dentro_de
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):
offset = int(offset)
dt = datetime.now() + timedelta(hours=offset)
html = "En %i hora(s), sern las %s." % (offset, dt)
return HttpResponse(html)
urls.py
vlews.py
L[emp|o 2: http://mysite.com/time/plus/2
UkLs y V|stas
from django.conf.urls.defaults import *
from mysite.views import dentro_de
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):
offset = int(offset)
dt = datetime.now() + timedelta(hours=offset)
html = "En %i hora(s), sern las %s." % (offset, dt)
return HttpResponse(html)
urls.py
vlews.py
L[emp|o 2: http://mysite.com/time/plus/2
}8ecuerda!: MvC
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
1emp|ates
-
Separan la lglca de presentac|n a una capa lndependlenLe.
-
llcheros lndependlenLes (.hLml)
-
Lengua[e lndependlenLe (}para dlsenadores!)
1emp|ates
-
Se basan en dos upos de ob[eLos: 1emplaLe() y ConLexL().
-
un ob[eLo 1emp|ate() conuene el str|ng de sallda que
queremos devolver en el Pup8esponse (normalmenLe
P1ML), pero lncluyendo euqueLas especlales de u[ango.
-
un ob[eLo Context() conuene un d|cc|onar|o con los
valores que dan conLexLo a una planulla, los que deben
usarse para renderlzar un ob[eLo 1emplaLe().
"Bienvenido, {{ user }}."
{'user': 'alatar'}
1emplaLe:
ConLexL:
"Bienvenido, alatar."
1emp|ates
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)
-
r|mera aproxlmacln al ob[euvo: 1emp|ate + Context
1emp|ates
-
Segunda aproxlmacln al ob[euvo: open(), read(), c|ose()
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)
1emp|ates
-
Segunda aproxlmacln al ob[euvo: open(), read(), c|ose()
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)
1emp|ates
-
Segunda aproxlmacln al ob[euvo: open(), read(), c|ose()
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)
8
o
r
ln
g

b
o
lle
r
p
la
L
e

c
o
d
e
!
1emp|ates
-
1ercera aproxlmacln al ob[euvo: get_temp|ate()
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)
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
1emp|ates
-
1ercera aproxlmacln al ob[euvo: get_temp|ate()
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
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)
1emp|ates
-
1ercera aproxlmacln al ob[euvo: get_temp|ate()
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
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)
S
u
l
l

b
o
r
l
n
g
.
.
.
1emp|ates
-
Cb[euvo 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})
1emp|ates
-
Cb[euvo 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})
8
o
r
l
n
g
.
.
.
?
1emp|ates
-
Cb[euvo 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})
AWLSCML!
1emp|ates: 1|p
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py a)
1emp|ates: 1|p
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
8
e
u
s
a
b
l
e

a
p
p
s
?
a)
1emp|ates: 1|p
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
8
e
u
s
a
b
l
e

a
p
p
s
?
a)
b)
-
La carpeLa /templates es buscada denLro de cada app.
-
Convlene lnclulr una carpeLa con el nombre de la app por clarldad.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
)
return render_to_response('website/index.html')
AlLernauva reuullzable:
}Lmpleza nuesLro prlmer proyecLo!
a) Crear la app dwluer./0123%0.
b) lnclulr la app en semngs.py.
c) uenlr u8Ls en urls.py:
!
user/<username>/status/<tweet_id>/
!
user/<username>/follow/
!
user/<username>/unfollow/
!
user/<username>/
!
search/
!
users/
d) Crear una vlsLa para /" que renderlce
un umellne de Lwluer en una LemplaLe
lndex.hLml a parur de daLos
hardcodeados en un dlcclonarlo.
1emp|ates en deta||e
-
S|, oLro slsLema de LemplaLes
-
SmarLy, 1lles, ClearSllver ...
-
uescrlben cul va a ser el resulLado que ven los usuarlos.
-
uesacoplado de yLhon ( ulsenadores muy le[os de yLhon )
-
P1ML (o no)... con estero|des.
-
Muy senclllo de aprender
-
klSS: keep lL Slmple, SLupld
-
Muy senclllo de exLender
I||osoha y L|m|tac|ones
-
La slnLaxls debe esLar desacoplada del P1ML/xML.
-
Los dlsenadores saben P1ML.
-
Los dlsenadores no saben yLhon.
-
no conslsLe en lnvenLarse un lengua[e.
-
una varlable no puede camblar el valor de una varlable.
-
una LemplaLe no puede e[ecuLar cdlgo yLhon.
1emp|ates: {{}}
<html>
<head>Ejemplo templates</head>
<body>
Hola, {{ username }}.
</body>
</html>
{'username': 'juan'}
<html>
<head>Ejemplo templates</head>
<body>
Hola, juan.
</body>
</html>
lllLers y 1ags
I||ters y 1ags
I||ters y 1ags
{{ varible|filter }}
h|ter
I||ters y 1ags
{{ varible|filter }}
h|ter
{% tag var1 var2 %}
|n||ne tag
I||ters y 1ags
{{ varible|filter }}
h|ter
{% tag var1 var2 %}
|n||ne tag
{% tag var1 %}
...
{% endtag %}
b|ock tag
1emp|ates: tags { }
1emp|ates: tags { }
{% comment %} Bu! {% endcomment %}
comment
1emp|ates: tags { }
{% comment %} Bu! {% endcomment %}
comment
for
{% for elemento in lista %}
<li>{{ elemento }}<li>
{% endfor %}
1emp|ates: tags { }
{% comment %} Bu! {% endcomment %}
comment
for
{% for elemento in lista %}
<li>{{ elemento }}<li>
{% endfor %}
|f
{% if username == "Juan" %}
Hola Juan, me gustas!
{% else %}
Hola {{ username }},
{% endif %}
== != > < >= <=
in and or not

4,50, !: 1ags
a) uullzar Lags para que el umellne se
muesLre con el slgulenLe formaLo:
-
<username>: <LweeL>
-
<username>: <LweeL>
-
...
1emp|ates: I||ters
<html>
<head>Ejemplo templates</head>
<body>
Hola, {{ username|title }}.
</body>
</html>
{'username': 'juan'}
<html>
<head>Ejemplo templates</head>
<body>
Hola, Juan.
</body>
</html>
nt|e
1emp|ates: I||ters
1emp|ates: I||ters
{'username': 'Juan es majo'}
{{ username|length }}
|ength
12
1emp|ates: I||ters
{'username': 'Juan es majo'}
{{ username|length }}
|ength
12
{{ username|cut }}
cut
Juanesmajo
1emp|ates: I||ters
{'username': 'Juan es majo'}
{{ username|length }}
|ength
12
{{ username|cut }}
cut
Juanesmajo
{{ username|slugify }}
s|ug|fy
juan-es-majo
1emp|ates: I||ters
{'username': 'Juan es majo'}
{{ username|length }}
|ength
12
{{ username|cut }}
cut
Juanesmajo
{{ username|slugify }}
s|ug|fy
juan-es-majo
{{ username|wordcount }}
wordcount
3
1emp|ates: I||ters
{'username': 'Juan es majo'}
{{ username|length }}
|ength
12
{{ username|cut }}
cut
Juanesmajo
{{ username|slugify }}
s|ug|fy
juan-es-majo
{{ username|upper }}
upper
JUAN ES MAJO
{{ username|wordcount }}
wordcount
3
1emp|ates: I||ters
{'username': 'Juan es majo'}
{{ username|length }}
|ength
12
{{ username|cut }}
cut
Juanesmajo
{{ username|slugify }}
s|ug|fy
juan-es-majo
{{ username|upper }}
upper
JUAN ES MAJO
{{ username|wordcount }}
wordcount
3
{{ username|default:Desconocido }}
defau|t
{'username': None}
Desconocido
1emp|ates: I||ters
1emp|ates: I||ters
{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}
{{ username|striptags }}
str|ptags
Juan es majo guapo y listo
1emp|ates: I||ters
{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}
{{ username|striptags }}
str|ptags
Juan es majo guapo y listo
{{ username|truncatewords_html:4 }}
truncatewords_htm|
Juan es <b>majo guapo</b> ...
1emp|ates: I||ters
{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}
{{ username|striptags }}
str|ptags
Juan es majo guapo y listo
{{ username|truncatewords_html:4 }}
truncatewords_htm|
Juan es <b>majo guapo</b> ...
{{ username|removetags:em a br }}
removetags
Juan es <b>majo guapo y listo</b>
1emp|ates: I||ters
1emp|ates: I||ters
{'url': 'Visitad http://www.djangoproject.com'}
{{ url|urlize }}
ur||ze
Visitad <a href=http://www.djangoproject.com>
http://www.djangoproject.com </a>
1emp|ates: I||ters
{'url': 'Visitad http://www.djangoproject.com'}
{{ url|urlize }}
ur||ze
Visitad <a href=http://www.djangoproject.com>
http://www.djangoproject.com </a>
{{ url|urlizetrunc:16 }}
ur||zetrunc
Visitad <a href=http://www.djangoproject.com>
http://www.djang...</a>
1emp|ates: I||ters
{'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
1emp|ates: I||ters
{'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
{{ lista|unordered_list }}
unordered_||st
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>
1emp|ates: I||ters
1emp|ates: I||ters
{'value': 123456789}
{{ value|add:1 }}
add
123456790
1emp|ates: I||ters
{'value': 123456789}
{{ value|add:1 }}
add
123456790
{{ value|filesizeformat }}
h|es|zeformat
117.7MB
1emp|ates: I||ters
{'value': 123456789}
{{ value|add:1 }}
add
123456790
{{ value|filesizeformat }}
h|es|zeformat
117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:d M Y }}
date
11 Sep 2010
1emp|ates: I||ters
{'value': 123456789}
{{ value|add:1 }}
add
123456790
{{ value|filesizeformat }}
h|es|zeformat
117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:d M Y }}
date
11 Sep 2010
{{ date|timesince }}
nmes|nce
4 days, 6 hours
1emp|ates: I||ters
{'value': 123456789}
{{ value|add:1 }}
add
123456790
{{ value|filesizeformat }}
h|es|zeformat
117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:d M Y }}
date
11 Sep 2010
{{ date|timesince }}
nmes|nce
4 days, 6 hours
{{ date|timeuntil }}
nmeunn|
1 days, 6 hours

4,50, ): lllLers
a) Anadlr a cada LweeL del umellne el
uempo Lranscurrldo:
-
<username>: <LweeL>
<n> seconds ago
-
<username>: <LweeL>
<n> mlnuLes ago
-
...
1emp|ates: tags { }
1emp|ates: tags { }
cyc|e
{% for elemento in lista %}
<li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li>
{% endfor %}
1emp|ates: tags { }
cyc|e
{% for elemento in lista %}
<li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li>
{% endfor %}
|nc|ude {% include "foo/bar.html" %}
1emp|ates: tags { }
cyc|e
{% for elemento in lista %}
<li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li>
{% endfor %}
|nc|ude {% include "foo/bar.html" %}
for|oop
{% for elemento in lista %}
<li>{{ forloop.counter }}.{{ elemento }}<li>
{% endfor %}
1emp|ates: tags { }
cyc|e
{% for elemento in lista %}
<li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li>
{% endfor %}
|nc|ude {% include "foo/bar.html" %}
for|oop
{% 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 %}

4,50, 7: 1ags avanzados
a) Pacer que el umellne muesLre el
mensa[e no hay LweeLs." sl el
dlcclonarlo reclbldo esL vaclo.
extend y b|ock
base.hLml
<html>
<head>
<title>Mi pgina personal</title>
</head>
<body>
{% block content %}
Contenido por defecto.
{% endblock %}
</body>
</html>
hl[a.hLml
{% extends "base.html" %}
{% block content %}
Hola desde la portada.
{% endblock %}

4,50, 8: Perencla de LemplaLes
a) uescargar nuesLra LemplaLe base.hLml.
b) lnclulrla en vuesLra app.
c) Pacer que vuesLro lndex.hLml herede
de base.hLml y exuenda el bloque
'conLenL' con su conLenldo.
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
Modelos
SCL?
L[emp|o SL
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})
L[emp|o SL
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})
1
L[emp|o SL
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})
1
2
L[emp|o SL
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})
1
2
3
L[emp|o SL
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})
1
2
3
4
L[emp|o SL
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})
1
2
3
4
5
L[emp|o SL
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})
1
2
3
4
5
6
12 llneas de #$%&'(... _
C8M (Cb[ecL-8elauonal mapplng)
C8M (Cb[ecL-8elauonal mapplng)
L[emp|o CkM
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
L[emp|o CkM
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
1
L[emp|o CkM
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
1
2
lucklng nln[as!
Mode|o
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)
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
Mode|o
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)
1
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
Mode|o
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)
2
1
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
Mode|o
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)
2
1
3
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
Mode|o
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)
2
1
3
4
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
Mode|o
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)
2
1
3
4
5
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
Mode|o
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)
2
1
3
4
5
6
-
Independenc|a SG8D!
-
uenlmos esLrucLuras de lnformacln genr|cas.
-
uenlmos restr|cc|ones )#&*#"((+ -('#.+ /'01(2#34*5556
-
0n|ca denlcln del modelo )$&#73"8'$%9#+ /':2& ' ;-6
lucklng Awesome nln[as!
1|pos de Datos

AutoField

BigIntegerField

BooleanField

CharField

CommaSeparatedIntegerField

DateField

DateTimeField

DecimalField

EmailField

FileField

FilePathField

FloatField

ImageField

IntegerField

IPAdressField

NullBooleanField

PositiveIntegerField

PositiveSmallIntegerField

SlugField

SmallIntegerField

TextField

TimeField

URLField

XMLField

ForeingKey

ManyToManyField

OneToOneField
1|pos de Datos

AutoField

BigIntegerField

BooleanField

CharField

CommaSeparatedIntegerField

DateField

DateTimeField

DecimalField

EmailField

FileField

FilePathField

FloatField

ImageField

IntegerField

IPAdressField

NullBooleanField

PositiveIntegerField

PositiveSmallIntegerField

SlugField

SmallIntegerField

TextField

TimeField

URLField

XMLField

ForeingKey

ManyToManyField

OneToOneField
rop|edades de |as I|e|d

null (True|Flase)

blank (True|False)

choices (lista)

default (valor)

editable (True|False)

help_text (String)

unique (True|False)

primary_key

unique_for_date

unique_for_month

unique_for_year
rop|edades de |as I|e|d

null (True|Flase)

blank (True|False)

choices (lista)

default (valor)

editable (True|False)

help_text (String)

unique (True|False)

primary_key

unique_for_date

unique_for_month

unique_for_year
jLs mag|a? 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;
jLs mag|a? 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;
jLs mag|a? No.
-
nombres de Lablas generados auLomucamenLe.
-
<app_name>_lower(<mode|_name>)
-
|d como rlmary key )<28=&#'(%>'-(26
-
Las lorelng key Lermlnan en _id )<28=&#'(%>'-(26
-
Los upos de daLos se a[usLan en funcln del SC8u
Conhgurar semngs.py

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
Conhgurar semngs.py

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
1
Conhgurar semngs.py

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
1
2
Conhgurar semngs.py

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
1
2
3
Creando 1ab|as
-
Crea las Lablas para todos los modelos de las apps |nsta|adas
en el chero semngs.py
-
No actua||za esquemas sl la Labla exlsLe.
-
Lllmlnar Labla y volver a e[ecuLar syncdb
Creando 1ab|as
$ python manage.py syncdb
-
Crea las Lablas para todos los modelos de las apps |nsta|adas
en el chero semngs.py
-
No actua||za esquemas sl la Labla exlsLe.
-
Lllmlnar Labla y volver a e[ecuLar syncdb
nuesLro prlmer modelo
a) Crear modelo 1weeL
b)Congurar semngs.py
c) ver el SCL generado con sqlall
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
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
django.contrib.auth
CuanLos slsLemas de AuLenucacln habels programado?
Alguno era me[or que el anLerlor? ,-)
conLrlb.auLh puede ser el ulumo :u
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
website.tweet
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
django.contrib.auth
8D L|sta para usarse
8D L|sta para usarse
nuesLro prlmer modelo
a) Pacer syncdb
rev|o: C|ases de| CkM
ts = Publisher.objects.all()
Model
Manager
QuerySet
rev|o: __un|code__()
rev|o: __un|code__()
>>> Publisher.objects.all()
[<Publisher: Publisher object>]
rev|o: __un|code__()
>>> Publisher.objects.all()
[<Publisher: Publisher object>]
rev|o: __un|code__()
>>> Publisher.objects.all()
[<Publisher: Publisher object>]
rev|o: __un|code__()
class Publisher(models.Model):
...

def __unicode__(self):
return self.name
>>> Publisher.objects.all()
[<Publisher: Publisher object>]
rev|o: __un|code__()
class Publisher(models.Model):
...

def __unicode__(self):
return self.name
>>> Publisher.objects.all()
[<Publisher: Publisher object>]
>>> Publisher.objects.all()
[<Publisher: Apress>]
INSLk1
INSLk1
>>> p = Publisher(
... name='Apress',
... address='2855 Telegraph Avenue',
... city='Berkeley',
... state_province='CA',
... country='U.S.A.',
... website='http://www.apress.com/')
>>> p.save()
a)
o = Model(...) o.save()
INSLk1
>>> 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/')
>>> p = Publisher(
... name='Apress',
... address='2855 Telegraph Avenue',
... city='Berkeley',
... state_province='CA',
... country='U.S.A.',
... website='http://www.apress.com/')
>>> p.save()
a)
o = Model(...) o.save()
manager.create(...)
b)
UDA1L
UDA1L
>>> ...
>>> p.id
52
>>> p.name = 'Apress Publishing'
>>> p.save()
o.save()
1
UDA1L
>>> Publisher.objects.all().update(country='USA')
2
>>> ...
>>> p.id
52
>>> p.name = 'Apress Publishing'
>>> p.save()
o.save()
queryset.update(...)
1
n
DLLL1L
DLLL1L
>>> ...
>>> p.id
52
>>> p.delete()
o.delete()
1
DLLL1L
>>> ps = Publisher.objects.all()
>>> ps.delete()
>>> ...
>>> p.id
52
>>> p.delete()
o.delete()
queryset.delete()
1
n
SLLLC1 de 1 resu|tado
SLLLC1 de 1 resu|tado
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
.get(...)
SLLLC1 de 1 resu|tado
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
.get(...)
>>> Publisher.objects.get(name="Anaya")
Traceback (most recent call last):
...
DoesNotExist: Publisher matching query does not exist.
SLLLC1 de 1 resu|tado
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
.get(...)
>>> 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.'}
>>> Publisher.objects.get(name="Anaya")
Traceback (most recent call last):
...
DoesNotExist: Publisher matching query does not exist.
SLLLC1 de N resu|tados
SLLLC1 de N resu|tados
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
SLLLC1 de N resu|tados
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter(
country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
.filter(...)
SLLLC1 de N resu|tados
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter(
country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
.filter(...)
>>> Publisher.objects.exclude(
country="U.S.A.", state_province="CA")
[<Publisher: O'Reilly>]
.exclude(...)
SLLLC1 de N resu|tados
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter(
country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
.filter(...)
>>> Publisher.objects.exclude(
country="U.S.A.", state_province="CA")
[<Publisher: O'Reilly>]
.exclude(...)
}
u
e
v
u
e
l
v
e
n

Q
u
e
r
y
S
e
t
s
,

n
o

l
l
s
L
a
s
!
get(), h|ter() y exc|ude()
get(), h|ter() y exc|ude()
Modelo.objects.filter(campo1="valor1", campo2="valor2")
Los parmeLros pueden lndlcar mucho ms que lgualdad (=)
get(), h|ter() y exc|ude()
Modelo.objects.filter(campo1="valor1", campo2="valor2")
Los parmeLros pueden lndlcar mucho ms que lgualdad (=)
campo__exact=''
campo__iexact=''
campo__contains=''
campo__icontains=''
campo__isnull=T|F
campo__day=31
campo__gt=0
campo__gte=0
campo__lt=0
campo__lte=0
campo__in=[ ,]
campo__month=12
campo__startswith=''
campo__istartswith=''
campo__endswith=''
campo__iendswith=''
campo__range=( ,)
campo__year=2010
CkDLk 8
CkDLk 8
>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
CkDLk 8
>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
CkDLk 8
>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by("-name", "country")
[<Publisher: O'Reilly>, <Publisher: Apress>]
Muluples campos:
CkDLk 8
>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by("-name", "country")
[<Publisher: O'Reilly>, <Publisher: Apress>]
Muluples campos:
}
1
a
m
b
l
e
n

d
e
v
u
e
l
v
e

Q
u
e
r
y
S
e
t
s
!
S||c|ng
S||c|ng
>>> Publisher.objects.order_by("name")[0]
<Publisher: Apress>
[n:m]
>>> Publisher.objects.order_by("name")[:2]
[<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.order_by("name")[1:2]
[<Publisher: O'Reilly>]
S||c|ng
>>> Publisher.objects.order_by("name")[0]
<Publisher: Apress>
[n:m]
>>> Publisher.objects.order_by("name")[:2]
[<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.order_by("name")[1:2]
[<Publisher: O'Reilly>]
L
l
M
l
1
S||c|ng
>>> Publisher.objects.order_by("name")[0]
<Publisher: Apress>
[n:m]
>>> Publisher.objects.order_by("name")[:2]
[<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.order_by("name")[1:2]
[<Publisher: O'Reilly>]
L
l
M
l
1
C
l
l
S
L
1
ke|ated Cb[ects
ke|ated Cb[ects
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
1
1
ke|ated Cb[ects
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
>>> c.motor
<Motor: Motor object>
Cmo usamos la relacln desde las lnsLanclas?
Craclas a nosoLros
1
1
ke|ated Cb[ects
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
>>> c.motor
<Motor: Motor object>
>>> m.coche
<Coche: Coche object>
Cmo usamos la relacln desde las lnsLanclas?
Craclas a nosoLros Craclas a D[ango
1
1
ke|ated Cb[ects
ke|ated Cb[ects
ForeignKeyField
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog)
1
n
ke|ated Cb[ects
ForeignKeyField
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog)
>>> p.blog
<Blog: Blog object>
>>> b.post_set.all()
[<Post: Post object>, ...]
Cmo usamos la relacln desde las lnsLanclas?
Craclas a nosoLros Craclas a D[ango
1
n
ke|ated Cb[ects
ke|ated Cb[ects
ManyToManyField
class Post(models.Model):
tags = ManyToManyField(Tag)
class Tag(models.Model):
...
n
m
ke|ated Cb[ects
ManyToManyField
class Post(models.Model):
tags = ManyToManyField(Tag)
class Tag(models.Model):
...
>>> p.tags.add(t1, t2)
>>> p.tags.all()
[<Tag: Tag object>, ...]
>>> t.post_set.add(p1, p2)
>>> t.post_set.all()
[<Post: Post object>, ...]
Cmo usamos la relacln desde las lnsLanclas?
Craclas a nosoLros Craclas a D[ango
n
m
ke|ated Cb[ects
ke|ated Cb[ects
Ln Lodas ellas podemos renombrar el punLero lnverso
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
1
n
ke|ated Cb[ects
Ln Lodas ellas podemos renombrar el punLero lnverso
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog
<Blog: Blog object>
>>> b.posts.all()
[<Post: Post object>, ...]
Craclas a nosoLros Craclas a D[ango
1
n
ke|ated Cb[ects
Ln Lodas ellas podemos renombrar el punLero lnverso
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog
<Blog: Blog object>
>>> b.posts.all()
[<Post: Post object>, ...]
Craclas a nosoLros Craclas a D[ango
1
n
Cuando haya 2 re|ac|ones entre 2 mode|os, ser ob||gator|o
? la gulnda nal: }1odo es LAZ?!
Laz|ness
Laz|ness
-
Las consulLas s|o se e[ecuLarn cuando realmenLe se
neceslLe obLener los ob[eLos. Ln las slgulenLes slLuaclones:
-
lLeraclones
-
Sllclng
-
Serlallzacln

repr()

len() !!!

list()

bool()
for p in Publisher.objects.all():
Publisher.objects.filter(country='USA')[0]
[Cache]
[<Publisher: Publisher object>]
len(Publisher.objects.all())
list(Publisher.objects.all())
if Publisher.objects.filter(country='USA'):
usando el C8M
a) lnserLar varlos 1weeLs desde la shell
b)Modlcar views.index para que uullce
los 1weeLs reales de la 8u
c) lmplemenLar u8L y vlew para ofrecer
permallnks a los LweeLs:
!
u8L: user/<username>/status/<tweet_id>
!
vlew: tweet_page
!
1emplaLe: tweet_page.html (8a[ar)
d)shorLcuL!: get_object_or_404()
roles
roh|e
-
rob|ema: Ll modelo ?=28 de ;@'#3&5$&#*8%-5'"*4 no puede
conLener Loda la lnformacln que neceslLamos.
-
username, assword, name.... y poco ms.
-
So|uc|n: uenlr un roh|e (un Modelo Agregado) para
guardar esa lnformacln.
roh|e
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
...
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
...
AUTH_PROFILE_MODULE = "website.Profile"
semngs.py
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
...
AUTH_PROFILE_MODULE = "website.Profile"
semngs.py
mode|s.py
-
Cada ob[eLo ?=28 de ;@'#3&5$&#*8%-5'"*4 dlspone de un
meLodo geL_prole() que nos permlur acceder al role.
roh|e
-
uonde Lengamos el user Lendremos el role.
-
uonde Lengamos el role, Lendremos el user.
roh|e
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(id=1)
>>> type(u)
<class 'django.contrib.auth.models.User'>
>>> profile = u.get_profile()
>>> type(profile)
<class 'website.models.Profile'>
-
uonde Lengamos el user Lendremos el role.
-
uonde Lengamos el role, Lendremos el user.
1 user = 1 role Cundo se crea un user?
S|gna|s
-
u[ango lncorpora un dlspacher de senales para ayudar a
crear apllcaclones reuullzables.
-
ermlLe subscrlblrnos a evenLos" a lo largo de Lodo el
framework y acLuar frenLe a ellos.
-
Senales lnLeresanLes:

pre_save, post_save

pre_delete, post_delete

m2m_changed

request_started, request_finished
hup://docs.d[angopro[ecL.com/en/dev/ref/slgnals/
S|gna|s
S|gna|s
def profile_signal_callback(sender, **kwargs):
if kwargs.get('created'):
profile = Profile()
profile.user = User.objects.get(id=kwargs.get('instance').id)
profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User,
dispatch_uid="users-profilecreation-signal")
1
S|gna|s
def profile_signal_callback(sender, **kwargs):
if kwargs.get('created'):
profile = Profile()
profile.user = User.objects.get(id=kwargs.get('instance').id)
profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User,
dispatch_uid="users-profilecreation-signal")
1
2
S|gna|s
def profile_signal_callback(sender, **kwargs):
if kwargs.get('created'):
profile = Profile()
profile.user = User.objects.get(id=kwargs.get('instance').id)
profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User,
dispatch_uid="users-profilecreation-signal")
1
2
3
S|gna|s
def profile_signal_callback(sender, **kwargs):
if kwargs.get('created'):
profile = Profile()
profile.user = User.objects.get(id=kwargs.get('instance').id)
profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User,
dispatch_uid="users-profilecreation-signal")
1
2
3
4
S|gna|s
def profile_signal_callback(sender, **kwargs):
if kwargs.get('created'):
profile = Profile()
profile.user = User.objects.get(id=kwargs.get('instance').id)
profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User,
dispatch_uid="users-profilecreation-signal")
1
2
3
4
uede estar en cua|qu|er app de nuestro proyecto.
Se recomlenda models.py
users en dwluer
a) Crear el modelo Profile
b)Crear Lrlgger de agregacln con
User medlanLe slgnals
c) Lllmlnar 8u
d)Pacer syncdb
lollowers
roh|e
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
followers = models.ManyToManyField("self", blank=True,
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
followers = models.ManyToManyField("self", blank=True,
symmetrical=False,
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
followers = models.ManyToManyField("self", blank=True,
symmetrical=False,
related_name="following")
mode|s.py
roh|e
class Profile(models.Model):

user = models.OneToOneField(User, unique=True)
bio = models.CharField(blank=True, max_length=200)
followers = models.ManyToManyField("self", blank=True,
symmetrical=False,
related_name="following")
mode|s.py
-
m2m symmeLrlcal ):&8 ;2!2$*&6
-
Sl yo Le slgo a u, Lu me slgues a ml.
-
relaLed_name )2# 2=*2 $'=&6
-
Llmpleza y evlLar profile_set
users en dwluer
a) Anadlr Many1oMany para los followers
b)Lllmlnar 8u
c) Pacer syncdb
1,2,3 8orrar la 8u.... 1,2,3... 8orrar la 8u
llxLures
I|xtures
-
Ls muy aburrldo crear [uegos de daLos cada vez que se
ellmlna una Labla / 8u.
-
No nos gusLan las cosas aburrldas.
-
llcheros ([son/xml/yaml) para lnlclallzar una 1abla.
-
ueden crearse una vez dlspongamos de la lnformacln:
I|xtures
-
Ls muy aburrldo crear [uegos de daLos cada vez que se
ellmlna una Labla / 8u.
-
No nos gusLan las cosas aburrldas.
-
llcheros ([son/xml/yaml) para lnlclallzar una 1abla.
-
ueden crearse una vez dlspongamos de la lnformacln:
python manage.py dumpdata <appName appName appName.model ...>
I|xtures
-
Ls muy aburrldo crear [uegos de daLos cada vez que se
ellmlna una Labla / 8u.
-
No nos gusLan las cosas aburrldas.
-
llcheros ([son/xml/yaml) para lnlclallzar una 1abla.
-
ueden crearse una vez dlspongamos de la lnformacln:
python manage.py dumpdata <appName appName appName.model ...>
-
Se cargan uullzando:
python manage.py loaddata <fixture fixture ...>
-
Sl se llaman %#%A'(1;'*' y esLn denLro de la carpeLa xLures
de la app, se cargan al ahcer el syncdb.
Ll poder de los xLures
a) Crear la carpeLa webslLe/xLures
b)uescargar lnlual_daLa.[son y
meLerlo en la carpeLa xLures
c) Pacer syncdb
d)lmplemenLar u8L y vlew para
ofrecer pglnas de usuarlo:
!
u8L: user/<username>/
!
vlew: user_page
!
1emplaLe: user_page.html (8a[ar)
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
C8uu: CreaLe, 8eLrleve, updaLe ueleLe
d[ango.contr|b.adm|n
1
2
3
d[ango.contr|b.adm|n
1
2
3
d[ango.contr|b.adm|n
1
D[ango adm|n: Insta|ac|n
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
...
# (r'^admin/', include(admin.site.urls)),
...
)
1
2
urls.py
D[ango adm|n: Insta|ac|n
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
...
(r'^admin/', include(admin.site.urls)),
...
)
1
2
urls.py
D[ango adm|n: Insta|ac|n
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',

...
)
semngs.py
D[ango adm|n: Insta|ac|n
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
...
)
semngs.py
1
Actua||zando |a 8D
Actua||zando |a 8D
$ python manage.py syncdb
Creating table django_admin_log
Installing index for admin.LogEntry model
Admln llsLa para usar
j nuestra app?
?
j nuestra app?
adm|n.py
-
Cada app debe de Lener el suyo.
-
uene que modelos sern vlslbles desde el admln y
permlLe personallzar su aspecLo.
from django.contrib import admin
from website.models import Tweet
class TweetAdmin(admin.ModelAdmin):
list_display = ('id','user','message','timestamp')

admin.site.register(Tweet, TweetAdmin)
lnsLalar Admln
a) Congurar urls.py
b)Congurar semngs.py
c) Pacer syncdb
d)Comprobar que no esL 1weeL
e) Anadlr admln.py
f) robar AdmlnlsLracln
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
lormularlos
C|ases |nvo|ucradas
C|ases |nvo|ucradas
Widget ComponenLe v|sua| equlvalenLe a P1ML
TextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
C|ases |nvo|ucradas
Widget ComponenLe v|sua| equlvalenLe a P1ML
TextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field Lg|ca de un campo, asoclado a un WldgeL
EmailField
IPAddressField
widget, initial, error, ...
C|ases |nvo|ucradas
Widget ComponenLe v|sua| equlvalenLe a P1ML
TextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field Lg|ca de un campo, asoclado a un WldgeL
EmailField
IPAddressField
widget, initial, error, ...
Form
Con[unto de llelds de un formularlo
ContactForm [nombre, email, telefono, mensaje, ...]
I|e|ds
I|e|ds
" BooleanField
" CharField
" ChoiceField
" TypedChoiceField
" DateField
" DateTimeField
" DecimalField
" EmailField
" FileField
" FilePathField
" FloatField
" ImageField
" IntegerField
" IPAddressField
" MultipleChoiceField
" NullBooleanField
" RegexField
" SlugField
" TimeField
" URLField
" ComboField
" MultiValuefield
" SplitDateTimeField
" ModelChoiceField
" ModelMultipleChoiceField
I|e|ds
" BooleanField
" CharField
" ChoiceField
" TypedChoiceField
" DateField
" DateTimeField
" DecimalField
" EmailField
" FileField
" FilePathField
" FloatField
" ImageField
" IntegerField
" IPAddressField
" MultipleChoiceField
" NullBooleanField
" RegexField
" SlugField
" TimeField
" URLField
" ComboField
" MultiValuefield
" SplitDateTimeField
" ModelChoiceField
" ModelMultipleChoiceField
Creac|n de un Iorm
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100, label='Topic')
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
-
aso 1]3: uenlcln del formularlo en forms.py
Creac|n de un Iorm
<html>
<body>
<h1>Contact us</h1>
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.
</p>
{% endif %}
<form action="" method="post">
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit">
</form>
</body>
</html>
-
aso 2]3: MaqueLacln del formularlo en su temp|ate
Creac|n de un Iorm
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
-
aso 3]3: rogramacln de la vlsLa en v|ews.py
Creac|n de un Iorm
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
-
aso 3]3: rogramacln de la vlsLa en v|ews.py

a
u
e
r
n
Creac|n de un Iorm
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
-
aso 3]3: rogramacln de la vlsLa en v|ews.py

a
u
e
r
n
Creac|n de un Iorm
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
-
aso 3]3: rogramacln de la vlsLa en v|ews.py

a
u
e
r
n
Va||dac|n prop|a
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError("Not enough words!")
return message
odemos programar valldacln exLra asoclada a cada lleld
del formularlo escrlblendo un meLodo clean_<fieldname>:
Va||dac|n prop|a
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError("Not enough words!")
return message
odemos programar valldacln exLra asoclada a cada lleld
del formularlo escrlblendo un meLodo clean_<fieldname>:
Maquetac|n prop|a
...
<form action="" method="post">
<div class="field">
{{ form.subject.errors }}
<label for="id_subject">Subject:</label>
{{ form.subject }}
</div>
<div class="field">
{{ form.email.errors }}
<label for="id_email">E-mail:</label>
{{ form.email }}
</div>
...
<input type="submit" value="Submit">
</form>
...
odemos personallzar la maqueLacln LanLo como
queramos, presclndlendo de las ayudas de form.as_table:
<style type="text/css">
ul.errorlist {
...
}
.errorlist li {
...
}
</style>
ara los dlsenadores:
lorms a parur de Models: Ll CCLMC del u8?
Iorms a parnr de Mode|s
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
birth_date = models.DateField(blank=True, null=True)
country = models.ModelChoiceField(Country)
...
from django import forms
from books.models import Author

class AuthorForm(forms.ModelForm):
class Meta:
model = Author
exclude = ('country',)
models.py
forms.py
rlmer lorm en dwluer
a) Crear un lorm que permlLa
publlcar LweeLs desde lndex.hLml
al usuarlo que esLe logueado desde
d[ango.conLrlb.admln (no Lenemos
logln proplo).
Ind|ce
!" #$%&'(
a. lnLroduccln
b. 1lpos de daLos
c. Cperadores
d. usos frecuenLes
e. LsLrucLuras
f. SenLenclas
g. L[erclclo
)" *+,(-'
a. lnLroduccln
b. u8Ls y vlsLas
c. 1emplaLes
d. Modelo
e. AdmlnlsLracln
f. lormularlos
g. Magla avanzada

r
o
y
e
c
L
o
Magla avanzada
Mag|a avanzada
1. ConLexL rocessors
2. Mlddleware
3. Cachlng
4. ueploylng u[ango
3. Apps recomendadas
Mag|a avanzada
1. ConLexL rocessors
2. Mlddleware
3. Cachlng
4. ueploylng u[ango
3. Apps recomendadas
Context rocessors
rob|ema
!
! ! !
!
!
!
!
Context rocessors
So|uc|n: el ob[eLo kequestContext()
c = RequestContext(request, {'tweets': tweets})
-
SusuLuye a ConLexL().
-
8eclbe un Pup8equesL() anLes del dlcclonarlo.
-
AuLomucamenLe allmenLa nuesLro dlcclonarlo con Lodos
los dlcclonarlos devuelLos por los Context rocessors que
Lengamos hablllLados.
Context rocessors
ConLexL rocessors? Son funclones.
-
8eclben un Pup8equesL() como unlco parmeLro.
-
uevuelven un dlcclonarlo para ser usado como ConLexL().
Context rocessors
ConLexL rocessors? Son funclones.
def ip_address_processor(request):
return {'ip_address': request.META['REMOTE_ADDR']}
-
8eclben un Pup8equesL() como unlco parmeLro.
-
uevuelven un dlcclonarlo para ser usado como ConLexL().
Context rocessors
ConLexL rocessors? Son funclones.
def ip_address_processor(request):
return {'ip_address': request.META['REMOTE_ADDR']}
-
8eclben un Pup8equesL() como unlco parmeLro.
-
uevuelven un dlcclonarlo para ser usado como ConLexL().
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.contrib.messages.context_processors.messages",
"website.context_processors.ip_address_processor",
)
Context rocessors
Cue ocurre con render_to_response()?
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
Context rocessors
Cue ocurre con render_to_response()?
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
Context rocessors
Cue ocurre con render_to_response()?
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
from django.shortcuts import render_to_response
from django.template import RequestContext
def render_response(req, *args, **kwargs):
kwargs['context_instance'] = RequestContext(req)
return render_to_response(*args, **kwargs)
Conse[o
Mag|a avanzada
1. ConLexL rocessors
2. Mlddleware
3. Cachlng
4. ueploylng u[ango
3. Apps recomendadas
M|dd|eware
nos permlLe escrlblr funclonalldad reuullzable
que se lnserLa en el u[o de e[ecucln de u[ango
M|dd|eware
class MyMiddleware(object):
def process_request(self, request):
"""Se ejecuta antes de que Django decida a qu! View llamar.
-> HttpRequest(): Se corta el flujo de middleware.
-> None: El flujo sigue con el siguiente middleware."""
# ...

def process_view(self, request, view_func, view_args, view_kwargs):
"""Se ejecuta antes de que se llame a la View.
-> HttpRequest(): Se corta el flujo de middleware.
-> None: El flujo sigue con el siguiente middleware."""
# ...
def process_response(self, request, response):
"""Se ejecuta despu!s de que la View devuelva una response.
-> HttpResponse()"""
# ...
def process_exception(self, request, exception):
"""Se ejecuta cuando una View lanza una excepci!n.
-> HttpResponse().
-> None: La excepci!n se propaga hasta el cliente."""
# ...
M|dd|eware
1enemos que lnclulr nuesLro mlddleware en el lugar
que nos convenga, ten|endo en cuenta e| orden de
e[ecuc|n en |a kequest y en |a kesponse:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
Mag|a avanzada
1. ConLexL rocessors
2. Mlddleware
3. Cachlng
4. ueploylng u[ango
3. Apps recomendadas
cach|ng
-
Sl queremos escalar nuesLro proyecLo rpldamenLe.... Cache!
-
8ecomendado = /2/$'$42;
-
Acceder a la 8u es caro, muy caro.
-
Ll Pardware es graus" en comparacln con opumlzar cdlgo opumlzado.
-
L[emplo (lacebook):
cach|ng
-
Sl queremos escalar nuesLro proyecLo rpldamenLe.... Cache!
-
8ecomendado = /2/$'$42;
-
Acceder a la 8u es caro, muy caro.
-
Ll Pardware es graus" en comparacln con opumlzar cdlgo opumlzado.
-
L[emplo (lacebook):
300+1b Memcached
cach|ng
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
...
v|ews
cach|ng
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
...
v|ews
{% load cache %}
{% cache 500 sidebar %}
.. sidebar ..
{% endcache %}
temp|ates
cach|ng
|ow |eve|
cach|ng
|ow |eve|
>>> from django.core.cache import cache
>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'
-
odemos cachear cualquler upo de ob[eLo que se pueda serlallzar.
-
CuerySeLs
-
LlsLas
-
...
memcached uLMC
Mag|a avanzada
1. ConLexL rocessors
2. Mlddleware
3. Cachlng
4. ueploylng u[ango
3. Apps recomendadas
Dep|oy|ng D[ango
Dep|oy|ng D[ango
V|rtua|env + I + Iabr|c
V|rtua|env
-
lndependencla compleLa de las llbreras del slLema.
-
Cada proyecLo uene su [uego de llbreras en la versln que neceslLa
-
Sln mledo a acLuallzar
-
Sln mledo a mlgrar
-
eLc...
V|rtua|env
-
lndependencla compleLa de las llbreras del slLema.
-
Cada proyecLo uene su [uego de llbreras en la versln que neceslLa
-
Sln mledo a acLuallzar
-
Sln mledo a mlgrar
-
eLc...
$ virtualenv --no-site-packages mi_entorno
crear
V|rtua|env
-
lndependencla compleLa de las llbreras del slLema.
-
Cada proyecLo uene su [uego de llbreras en la versln que neceslLa
-
Sln mledo a acLuallzar
-
Sln mledo a mlgrar
-
eLc...
$ virtualenv --no-site-packages mi_entorno
crear
$ source mi_entorno/bin/activate
acnvar
I
-
CesLor de paqueLes del slglo 21 :u
-
ermlLe especlcar un chero de 8LCul8LMLn1S con un llsLado de
paqueLes a lnsLalar.
I
-
CesLor de paqueLes del slglo 21 :u
-
ermlLe especlcar un chero de 8LCul8LMLn1S con un llsLado de
paqueLes a lnsLalar.
u[ango==1.2.1
psycopg2
feedparser==4.1
sLrlpogram==1.3
CCharLWrapper==0.8
pip install -E mi_entorno -r REQUIREMENTS
Iabr|c
Repetition leads to boredom, boredom to horrifying mistakes,
horrifying mistakes to God-I-wish-I-was-still-bored

Iabr|c
env.user = "example"
env.hosts = ["example.com"]
def deploy():
run('svn up /home/example/')
sudo('/etc/init.d/lighttpd restart')
fabh|e.py
Repetition leads to boredom, boredom to horrifying mistakes,
horrifying mistakes to God-I-wish-I-was-still-bored

Iabr|c
env.user = "example"
env.hosts = ["example.com"]
def deploy():
run('svn up /home/example/')
sudo('/etc/init.d/lighttpd restart')
fabh|e.py
fabric deploy
uso
Repetition leads to boredom, boredom to horrifying mistakes,
horrifying mistakes to God-I-wish-I-was-still-bored

Mag|a avanzada
1. ConLexL rocessors
2. Mlddleware
3. Cachlng
4. ueploylng u[ango
3. Apps recomendadas
Apps
d[ango-reg|stranon
hup://blLbuckeL.org/ubernosLrum/d[ango-reglsLrauon/
d[ango-reg|stranon
hup://blLbuckeL.org/ubernosLrum/d[ango-reglsLrauon/
-
SlsLema compleLo para la gesun de usuarlos.
-
uesde el reglsLro, acuvacln eLc...
-
u8!!
-
lnsLalacln muy sencllla.
-
8ecomedado ++
d[ango-reg|stranon
hup://blLbuckeL.org/ubernosLrum/d[ango-reglsLrauon/
d[ango-reg|stranon
hup://blLbuckeL.org/ubernosLrum/d[ango-reglsLrauon/
/acuvaLe/compleLe/
/acuvaLe/acuvauonkey/
/ reglsLer/
/ reglsLer/compleLe/
/ reglsLer/closed/
/ logln/
/ logouL/
/ password/change/
/ password/change/done/
/ password/reseL/
/ password/reseL/conrm/Loken
/ password/reseL/compleLe/
/ password/reseL/done/
/ reacuvaLe/
d[ango-soc|a|reg|stranon
hup://glLhub.com/ashlngpumpkln/d[ango-soclalreglsLrauon
d[ango-soc|a|reg|stranon
hup://glLhub.com/ashlngpumpkln/d[ango-soclalreglsLrauon
-
Conguracln sencllla
-
AuLenucacln con:
-
Lwluer, facebook, oauLh, openld
-
lnLegracln perfecLa con conLrlb.auLh
da[axpro[ect
hup://da[axpro[ecL.com
da[axpro[ect
hup://da[axpro[ecL.com
-
Comunlcacln A!Ax muy sencllla
-
Cross8rowslng
-
Muy uul sl no sabemos demaslado !S
d[ango-|oca|e-ur|
hup://code.google.com/p/d[ango-localeurl/
d[ango-|oca|e-ur|
hup://code.google.com/p/d[ango-localeurl/
-
nos permlLe especlcar el ldloma en la url
www.example.com/en/
www.example.com/es/
-
Me[oras en el SLC
-
Cada pglna uene una unlca url.
-
Conguracln no Lan sencllla, pero lnLeresanLe.
d[ango-p|ston
hup://blLbuckeL.org/[espern/d[ango-plsLon/wlkl/Pome
d[ango-p|ston
hup://blLbuckeL.org/[espern/d[ango-plsLon/wlkl/Pome
-
lramework para crear Als 8LS1ful
-
Muy fcll lnsLalacln
-
Serlallzacln a:
-
!SCn, AML, yLhon yckle, xML ...
-
CAuLh
-
8ecomendado +++++
d[ango-sentry
hup://glLhub.com/dcramer/d[ango-senLry
d[ango-sentry
hup://glLhub.com/dcramer/d[ango-senLry
d[ango-debug-too|bar
hup://glLhub.com/robhudson/d[ango-debug-Loolbar
d[ango-command-extens|ons
hup://code.google.com/p/d[ango-command-exLenslons/
d[ango-command-extens|ons
hup://code.google.com/p/d[ango-command-exLenslons/
-
LxLensln para manage.py"
-
Muchas uulldades para el da a da
-
una de las me[ores: graphmodels
-
usando Craphvlz genera un modelo relaclonal de los modelos de
nuesLro proyecLo.
d[ango-command-extens|ons
d[ango-command-extens|ons
d[ango-command-extens|ons
d[ango-command-extens|ons
1extmate + D[ango
hups://blLbuckeL.org/bkerr/d[ango-LexLmaLe-bundles
1extmate + D[ango
hups://blLbuckeL.org/bkerr/d[ango-LexLmaLe-bundles
-
ShorLcuLs para crear:
-
Modelos
-
llelds
-
lllLers
-
1emplaLe1ags
-
lorms
-
Admln
uuranLe el curso lo hemos uullzado.
La punLa del lceberg
hup://www.d[angobook.com/
ulsfruLa programando.
!orge 8asuda [neo]
neo2001[gmall.com
!alme lrurzun [eLox]
[alme.lrurzun[gmall.com
[[orgebasuda [[almelrurzun

You might also like