![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/687546/django.png)
No programes sin framework
Python & Django
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6283605/Logo_Completo.png)
Os tengo que contar una historia
Backend
La alegría de ser un backed
Los comienzos de los backend
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688525/eniac4.jpg)
Backend "en paro"
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688528/tumblr_lyzmyouU3B1r53h4fo1_250.gif)
El boom de los backend
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688536/iphone10.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688539/android.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688558/cfph.gif)
Cada vez hay más curro ya que todo necesita un backend
Ventajas de ser backend
Capacidad de elección de tecnología
Resoluciones
Pasamos de...
Navegadores
Dispositivos móviles
¿Qué es un framework?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282020/2-compressor-1280x800.png)
Características de un framework backend
Características
- Gestión de Sesiones
- Request
- Gestión de URL's
- Login y registro de usuarios
- Sistema de plantillas
- Caché
- Caché de plantillas
- Modelos y Relaciones
- ORM
- Gestión de archivos estáticos
Python
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688565/newlogo-repro.png)
Historia
- Python fue creado a finales de los ochenta por Guido van RossumBullet Two
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878742/400px-Guido_van_Rossum_OSCON_2006.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878746/python.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878747/monty-pytho.jpg)
Mi primer contacto con el lenguaje
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/688576/contacto.gif)
Características
-
Lenguaje de alto nivel
-
Rápida curva de aprendizaje => novatos
-
Fácil lectura
-
Más tiempo leyendo código que programando
-
Multiplataforma
-
Multipropósito
Características
-
Fácil manejo de datos
-
Manejo de listas
-
Objetos
-
Obtener atributos
-
Setearlos
-
-
Programación orientada a objetos "bonita"
-
Sintaxis limpia
-
PEP
- Librerías
En otras palabras
if elemento not in lista
Si el elemento no está en la lista
The Zen of Python
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/689150/screenshot_250.jpg)
The Zen of Python
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/689152/screenshot_251.jpg)
Guía de estilos
# Declaración
a = 5
b = 4
Variables
# Tipado dinámico
a = 5
b = 'Hola mundo'
a = b
# Intercambiar valores
a = 5
b = 4
a,b = [b,a]
Variables
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/689157/screenshot_252.jpg)
Listas
>>> lista = ["abc", 42, 3.1415]
>>> lista[0] # Acceder a un elemento por su índice
'abc'
>>> lista[-1] # Acceder a un elemento usando un índice negativo
3.1415
>>> lista.append(True) # Añadir un elemento al final de la lista
>>> lista
['abc', 42, 3.1415, True]
>>> del lista[3] # Borra un elemento de la lista usando un índice (en este caso: True)
>>> lista[0] = "xyz" # Re-asignar el valor del primer elemento de la lista
>>> lista[0:2] # Mostrar los elementos de la lista del índice "0" al "2" (sin incluir este último)
['xyz', 42]
>>> lista_anidada = [lista, [True, 42L]] # Es posible anidar listas
>>> lista_anidada
[['xyz', 42, 3.1415], [True, 42L]]
>>> lista_anidada[1][0] # Acceder a un elemento de una lista dentro de otra lista (del segundo elemento, mostrar el primer elemento)
True
Listas
Métodos nativos como:
sort, reverse, len, min, max, remove, count, map, slice
Tuplas
>>> tupla = ("abc", 42, 3.1415)
>>> tupla[0] # Acceder a un elemento por su índice
'abc'
>>> del tupla[0] # No es posible borrar (ni añadir) un elemento en una tupla, lo que provocará una excepción
( Excepción )
>>> tupla[0] = "xyz" # Tampoco es posible re-asignar el valor de un elemento en una tupla, lo que también provocará una excepción
( Excepción )
>>> tupla[0:2] # Mostrar los elementos de la tupla del índice "0" al "2" (sin incluir este último)
('abc', 42)
>>> tupla_anidada = (tupla, (True, 3.1415)) # También es posible anidar tuplas
>>> 1, 2, 3, "abc" # Esto también es una tupla, aunque es recomendable ponerla entre paréntesis (recuerda que requiere, al menos, una coma)
(1, 2, 3, 'abc')
>>> (1) # Aunque entre paréntesis, esto no es una tupla, ya que no posee al menos una coma, por lo que únicamente aparecerá el valor
1
>>> (1,) # En cambio, en este otro caso, sí es una tupla
(1,)
>>> (1, 2) # Con más de un elemento no es necesaria la coma final
(1, 2)
>>> (1, 2,) # Aunque agregarla no modifica el resultado
(1, 2)
Diccionarios
>>> diccionario = {"cadena": "abc", "numero": 42, "lista": [True, 42L]}
>>> diccionario["cadena"] # Usando una clave, se accede a su valor
'abc'
>>> diccionario["lista"][0]
True
>>> diccionario["cadena"] = "xyz" # Re-asignar el valor de una clave
>>> diccionario["cadena"]
'xyz'
>>> diccionario["decimal"] = 3.1415927 # Insertar un nuevo elemento clave:valor
>>> diccionario["decimal"]
3.1415927
# También es posible que un valor sea un diccionario
>>> diccionario_mixto = {"tupla": (True, 3.1415), "diccionario": diccionario}
# Acceder a un elemento dentro de una lista, que se encuentra dentro de un diccionario
>>> diccionario_mixto["diccionario"]["lista"][1]
42L
Diccionarios
Métodos nativos como:
keys(), values(), items(), copy(), has_key()
Conjuntos
>>> conjunto_inmutable = frozenset(["a", "b", "a"])
>>> conjunto_inmutable
frozenset(['a', 'b'])
>>> conjunto1 = set(["a", "b", "a"]) # Primer conjunto mutable
>>> conjunto1
set(['a', 'b'])
>>> conjunto2 = set(["a", "b", "c", "d"]) # Segundo conjunto mutable
>>> conjunto2
set(['a', 'c', 'b', 'd']) # Recuerda, no mantienen el orden, como los diccionarios
>>> conjunto1 & conjunto2 # Intersección
set(['a', 'b'])
>>> conjunto1 | conjunto2 # Unión
set(['a', 'c', 'b', 'd'])
>>> conjunto1 - conjunto2 # Diferencia (1)
set([])
>>> conjunto2 - conjunto1 # Diferencia (2)
set(['c', 'd'])
>>> conjunto1 ^ conjunto2 # Diferencia simétrica
set(['c', 'd'])
Conjuntos
Métodos nativos como:
intersection, diferencia, union, diferencia_simétrica
Listas por comprensión
>>> range(5)
[0, 1, 2, 3, 4]
>>> [i*i for i in range(5)]
[0, 1, 4, 9, 16]
>>> lista = [(i, i + 2) for i in range(5)]
>>> lista
[(0, 2), (1, 3), (2, 4), (3, 5), (4, 6)]
>>> g = [ x ** 2 for x in range (10)]
[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81]
Slices
>>> x = range (1 , 10)
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x [:3]
[0 , 1, 2]
>>> x[:2]
[1, 2]
>>> x[:2]
[1, 2]
>>> x[-1]
9
>>> x[1:6:2]
[2, 4, 6]
x[start:end:step]
Pregunta
¿Alguna vez habéis intentado hacer una lista con los primeros 1000000000 números?
>>> [ x ** 2 for x in xrange (1000000000000000)]
# Tu ordenador explota
Generadores
¿Qué son?
>>> cuadrados = ( x ** 2 for x in range (1 , 11))
>>> cuadrados
< generator object < genexpr > at 0 x7f8b82504eb0 >
>>> next ( cuadrados )
1
>>> next ( cuadrados )
4
>>> cuadrados = ( x ** 2 for x in range (100000000000000))
>>> cuadrados
< generator object < genexpr > at 0 x7f8b82504eb0 >
>>> next ( cuadrados )
1
>>> next ( cuadrados )
4
Operadores lógicos
&& => and
|| => or
! => not
Condicionales
>>> verdadero = True
>>> if verdadero: # No es necesario poner "verdadero == True"
... print "Verdadero"
... else:
... print "Falso"
Verdadero
>>> lenguaje = "Python"
>>> if lenguaje == "C":
... print "Lenguaje de programación: C"
... elif lenguaje == "Python":
... print "Lenguaje de programación: Python"
... else:
... print "Lenguaje de programación: indefinido"
...
Lenguaje de programación: Python
>>> if verdadero and lenguaje == "Python":
... print "Verdadero y Lenguaje de programación: Python"
...
Verdadero y Lenguaje de programación: Python
Economía de condicionales
>> x = 4
>> x == 3 or x == 5 or x == 7:
False
>> x in (3 , 5 , 7)
False
>>> any ([ False , True , False ])
True
>>> any ([ False , False ])
False
>>> any ([])
False
>>> all ([ False , True , False ])
False
>>> all ([ True ])
True
>>> all ([])
True
Operador ternario
En casi todos los lenguajes
test ? a : b
En python
a if test else b
>>> x = 2
>>> " uno " if x == 1 else " otra cosa "
"otra cosa"
Bucles
>>> lista = ["a", "b", "c"]
>>> for i in lista: # Iteramos sobre una lista, que es iterable
... print i
...
a
b
c
>>> numero = 0
>>> while numero < 10:
... numero += 1
... print numero,
...
1 2 3 4 5 6 7 8 9
Sistema de objetos
Totálmente compatible con POO
Herencia múltiple
Sobrecarga de métodos
Sistema de objetos
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878760/consola.png)
Sistema de objetos
>>> cadena = "abc"
>>> cadena.upper()
'ABC'
>>> lista = [True, 3.1415] #List
>>> lista.append(42L)
>>> lista
[True, 3.1415, 42L]
>>> int ( True )
1
>>> int ( False )
0
>>> 37 + True
38
>>> 7 / False
Traceback ( most recent call last ):
File " < stdin > " , line 1, in < module >
ZeroDivisionError : float division
Intérprete
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/689307/screenshot_253.jpg)
Integración con el OS
os
sys
Comparativa IDE's
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/876859/Sublime_Text_Logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/876861/photo.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6281847/31985754-c56b8dba-b998-11e7-9705-a7f984433049.png)
Referencias
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/876854/pythonckbk_cover.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/876855/ora-pyref4e-big.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/876856/python-para-todos-1-0-1.jpg)
Ya se python
![](https://media1.giphy.com/media/3WvhJ783Le5ieNEZ8z/giphy.gif)
Django
Historia
Nació en el otoño de 2003
The World Online
Toda su línea editorial en la red está basada en su propia versión del padre de Django
Framework
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878777/Cap_tulo_1__Introducci_n_a_Django___El_libro_de_Django_1_0.png)
MTV
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878787/MTV.jpg)
MTV
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878788/esquema-mtv.png)
MTV
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878789/modelos.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878790/urls.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878792/vistas.png)
MTV
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878793/template.png)
BBDD
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878803/orm.png)
BBDD - Migrations
![](https://media0.giphy.com/media/3osxYc2axjCJNsCXyE/giphy.gif)
![](https://media3.giphy.com/media/jHGgdwrN2rawM/giphy.gif)
Models
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878812/Models___Django_documentation___Django.png)
Syncdb
ORM
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878816/orm.png)
Sin ORM:
SELECT * FROM Alumno WHERE edad = 17
Con ORM:
Alumno.objects.filter(edad = 17)
No te convenció?. Tal vez esto sí lo haga
Sin ORM:
SELECT * FROM “autores_autor” INNER JOIN “autor_libro” ON (“autores_autor”.”id” = “autores_libro”.”autor_id”)
INNER JOIN “autores_libro_librerias” ON (“autores_libro”.”id” = “autores_libro_librerias”.”libro_id”)
INNER JOIN “autores_libreria” ON (“autores_libro_librerias”.”libreria_id” = “autores_libreria”.”id”) WHERE “autores_libreria”.”nombre” = “La Cultura”
Con ORM:
Autor.objects.filter(libros__libreria__nombre = “La Cultura”)
ORM
Vistas (lógica)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878792/vistas.png)
Function Views
Vistas (Class Based Views)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878823/cbv.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878793/template.png)
Templates (presentación)
<table class="table datatable table-bordered table-striped">
<thead>
<tr>
<th class="text-center">Acción</th>
<th>Nombre</th>
<th>Apellidos</th>
<th>Email</th>
<th>Grupos</th>
<th>Último inicio de sesión</th>
</tr>
</thead>
<tbody>
{% for u in user_list %}
<tr>
<td class="text-center">
<a href="{% url 'team:teammember_detail' u.pk %}">
<i class="fa fa-pencil"></i>
</a>
</td>
<td>{{ u.first_name }}</td>
<td>{{ u.last_name }}</td>
<td><a href="mailto:{{ u.email }}">{{ u.email }}</a></td>
<td>
{% for g in u.groups.all %}
{{ g.name }}<br>
{% endfor %}
</td>
<td>{{ u.last_login|default:"Nunca" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Separar lógica de presentación
Herencia de plantillas
Bloques
Condicionales
Bucles
Template Tags
Custom Template Tags
Templates (presentación)
urlpatterns = [
path('visits-variant-visit/<int:pk>/',
VisitGetVariant.as_view(),
name='visit_variant_visit'
),
path('visit-variant-forbidden-dates/<int:pk>/',
VisitVariantForbiddenDates.as_view(),
name='visit_variant_forbidden_dates'
),
path('visit-variant-rate-day/<int:pk>/<int:year>/<int:month>/<int:day>/',
VisitVariantRateDay.as_view(),
name='visit_variant_rate_date'),
path('visit-variant-available-dates/<int:pk>/',
VisitVariantAvailableDates.as_view(),
name='visit_variant_available_dates'),
path('', include(router.urls))
]
URL
Formularios
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878829/django-forms.png)
Formularios
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282331/Captura_de_pantalla_2019-06-21_a_las_11.43.26.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282333/Captura_de_pantalla_2019-06-21_a_las_11.43.32.png)
Formularios
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282334/Captura_de_pantalla_2019-06-21_a_las_11.43.42.png)
Formularios
django-crispy-forms
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282338/form.png)
i18n
django-rosetta
django-modeltranslation
Middleware
Shell
Servidor de desarrollo
Caché
Aplicaciones plug and play
django packages
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282097/Captura_de_pantalla_2019-06-21_a_las_10.22.26.png)
django packages
Quien lo usa
instagram, the new york times, pinterest, nasa, mercedes, national geographic, the whashington post,
Referencias
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878848/1.6-cover-693x855-S.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878851/tsd-cover-beta.png)
http://django.es/docs/
http://stackoverflow.com/
La joya de la corona ADMIN
El admin de django es el mejor invento del mundo a la hora de tener un panel de control de entidades, relaciones y datos.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6281913/Captura_de_pantalla_2019-06-21_a_las_9.26.29.png)
Crea tus API's con
Django Rest Framework
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6281930/logo.png)
DEMO
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/689336/small-violin.gif)
Sorry. . .
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/689339/Fc9elLu.gif)
Tranquilos
Cookiecutter Django’s
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282347/cookiecutter.jpg)
Cookiecutter Django’s
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6282348/Captura_de_pantalla_2019-06-21_a_las_11.49.52.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/bienvenidosaez/images/878857/django_unchained.jpg)
¿Algo que objetar?
?
@bienvenidosaez
![](https://s3.amazonaws.com/media-p.slid.es/uploads/82497/images/6281877/Recurso_1.png)
No programes sin framework - Python & Django
By Bienvenido Sáez Muelas
No programes sin framework - Python & Django
Taller introductorio a las posibilidades que nos ofrece todo framework de programación a la hora de realizar tareas básicas de toda aplicación web.
- 1,059