Crush into Django in 60 minutes!

Presenter Notes

Matías Herranz

Presenter Notes

¿Quién?

  • Lic. en Ciencias de la Computación, FaMAF
  • +5 años de Python, Python/Django
  • Miembro de PyAr
  • Trabajo en Santex
  • Estudio música.
  • Me gustan las montañas, las guitarras y el té Earl Grey.
  • Y programar en Python, claro :)

Presenter Notes

Django

Presenter Notes

Algunos conceptos básicos

hola.

¿Qué es Django?

  • Django es un framework, pensado, nacido y evolucionado para el desarollo de aplicaciones web.
  • Agiliza o resuelve tareas repetitivas
  • Soluciona problemas o requerimientos frecuentes
  • Enfocado en código limpio y desarrollo rápido (as in "sin trabas innecesarias").

Presenter Notes

Algunos conceptos básicos

¿Para qué se usa?

Aplicaciones web de los más variados sabores y colores:

Presenter Notes

Así que....

Presenter Notes

Brace Yourselves

Presenter Notes

¡Y veamos de qué se trata esto!

Presenter Notes

Intro:

Veamos un poco de qué se trata Django:

Allá lejos y hace tiempo, por el año 2003, en el "Lawrence Journal World", en Kansas

  • Repetición de código
  • Pedazos de código que podían reutilizar entre proyectos
  • Resolver los mismos problemas una y otra vez
  • Juntaron todo, enceraron, pulieron, le pusieron nombre y lo liberaron en 2005

Presenter Notes

Una pizca de ingeniería de software

Patrón de diseño: MVC (Model-View-Controller)

Patrón de arquitectura de software que separa los datos, la interfaz de usuario y la lógica de control de una aplicación.

  • Modelo: Esta es la representación de la información con la cual el sistema opera.
  • Vista: Este presenta el modelo en un formato adecuado para interactuar, usualmente la interfaz de usuario.
  • Controlador: Este responde a eventos, usualmente acciones del usuario, e invoca peticiones al modelo y, probablemente, a la vista.

MVC

Presenter Notes

MVC y Django

Presenter Notes

MVC aplicado a Django

Model:

  • Representado en Django por los models (en el respectivo models.py de cada app)
  • Clases de Python
  • Modelan los datos

View:

  • representado en Django por los templates
  • forma de visualizar los datos
  • HTML, CSS, JS, Django templates

Controller

  • Representado por las views
  • Procesa los datos ingresados por el usuario
  • Lógica de la aplicación, procesamiento de los datos a renderizar mediante los templates

Presenter Notes

Habiendo hablado suficiente....

Presenter Notes

¡Escribamos código!

Code

Presenter Notes

Hagamos un pequeño blog

Instalamos Django:

1 MacBookPro: matias$ pip install django

Creamos el proyecto:

1 MacBookPro: matias$ mkdir MicroBlog
2 MacBookPro: matias$ cd MicroBlog/
3 MacBookPro:TwitterClone matias$ django-admin.py startproject microblog

Creamos una app para manejar los posts:

1 MacBookPro:microblog $ cd microblog/
2 MacBookPro:microblog $ python manage.py startapp posts

Presenter Notes

Hagamos un pequeño blog

Los archivos que nos crea el comando django-admin.py tiene rol función muy bien definido:

  • init.py: este archivo no está relacionado con Django particularmente, sino que es más específico de Python e indica que el directorio actual es un módulo.
  • manage.py: se utiliza para interactuar con el proyecto en particular. Es similar a django-admin.py pero específico de este proyecto. Mediante este programa se puede actualizar la base de datos, ejecutar el servidor de desarrollo, correr tests, etc.
  • settings.py: en este archivo se encuentra toda la configuración del proyecto en general; la conexión a la base de datos, qué tipo de base usar, en qué lenguaje está el sitio, etc. Observar que este archivo de configuración también es código Python.
  • urls.py: en este archivo se encuentran todas las url’s disponibles para nuestro sitio. La prolijidad que permite Django en el manejo de urls(con expresiones regulares, nombres, etc) es uno de los puntos fuertes del framework.

Presenter Notes

MicroBlog: models

Microblog/microblog/posts/models.py:

 1 import datetime
 2 
 3 from django.db import models
 4 from django.contrib.auth.models import User
 5 
 6 
 7 class Post(models.Model):
 8     """
 9     Model to represent the blog posts.
10     """
11     author = models.ForeignKey(User, blank=True, null=True)
12     message = models.TextField(max_length=140)
13     date_posted = models.DateTimeField(default=datetime.datetime.now)
14 
15     def __unicode__(self):
16         return "Post from: %s, Txt: %s" % \
17             (self.author.username, self.message,)

Presenter Notes

MicroBlog: views

Mostrar los posts:

Microblog/microblog/posts/views.py:

1 @login_required
2 def show_timeline(request):
3     context = RequestContext(
4         request,
5         {'posts': Post.objects.order_by('-date_posted')}
6     )
7     return render_to_response('posts/timeline.html', context)

Presenter Notes

MicroBlog: views

Crear un nuevo post:

Microblog/microblog/posts/views.py:

 1 @login_required
 2 def write_post(request):
 3     layout = 'vertical'
 4 
 5     if request.method == 'POST':
 6         form = PostForm(request.POST)
 7         if form.is_valid():
 8             new_post = form.save(commit=False)
 9             new_post.author = request.user
10             new_post.save()
11             return show_timeline(request)
12     else:
13         form = PostForm()
14 
15     context = RequestContext(
16         request,
17         {'form': form,  # The Django form instance
18          'layout': layout,  # For bootstrap toolkit UI rendering
19          }
20     )
21     return render_to_response('posts/form.html', context)

Presenter Notes

MicroBlog: templates

Crear un nuevo post:

Microblog/microblog/posts/templates/posts/form.html:

 1 {% extends "posts/base.html" %}
 2 
 3 {% block content %}
 4     <h1>Hi! Write your new post below:</h1>
 5 
 6     <form class="form-{{ layout }}" action="" method="post">
 7         {% csrf_token %}
 8         {{ form|as_bootstrap:layout }}
 9         {% if layout == "horizontal" %}
10             <p class="form-actions">
11                 <input type="submit" value="Submit" class="btn btn-primary">
12             </p>
13         {% else %}
14             <input type="submit" value="Submit" class="btn btn-primary">
15         {% endif %}
16     </form>
17 
18     <p>Hint: Submit the form with no content to see error messages styled into it.</p>
19 
20 {% endblock %}

Presenter Notes

MicroBlog: templates

Mostrar los posts:

Microblog/microblog/posts/templates/posts/timeline.html:

 1 {% extends "posts/base.html" %}
 2 
 3 {% load bootstrap_toolkit %}
 4 
 5 {% block content %}
 6     <h1>Hi! Take a look at the current posts below:</h1>
 7 
 8     {% for post in posts %}
 9         <div class="well">
10             <h1>Author: {{ post.author.username }}</h1>
11             <p>{{ post.message }}</p>
12         </div>
13     {% endfor %}
14 {% endblock %}

Presenter Notes

MicroBlog: urls

Microblog/microblog/posts/microblog/urls.py:

 1 from django.conf.urls import patterns, include, url
 2 from django.views.generic import TemplateView, RedirectView
 3 
 4 # Uncomment the next two lines to enable the admin:
 5 from django.contrib import admin
 6 admin.autodiscover()
 7 
 8 urlpatterns = patterns('',
 9     # Login url from Django:
10     url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='auth_login'),
11 
12     # Uncomment the next line to enable the admin:
13     url(r'^admin/', include(admin.site.urls)),
14 
15     # My urls:
16     url(r'^$',
17         TemplateView.as_view(template_name="posts/index.html"), name="home"),
18     url(r'^home/$', RedirectView.as_view(url='/')),
19     url(r'^write_post/$', 'posts.views.write_post', name='write_new_post'),
20     url(r'^read_posts/$', 'posts.views.show_timeline', name="read_posts"),
21 )

Presenter Notes

MicroBlog: settings

Microblog/microblog/posts/microblog/settings.py:

Agregamos la app que creamos dentro de INSTALLED_APPS, en settings.py:

 1 INSTALLED_APPS = (
 2     'django.contrib.auth',
 3     'django.contrib.contenttypes',
 4     'django.contrib.sessions',
 5     'django.contrib.sites',
 6     'django.contrib.messages',
 7     'django.contrib.staticfiles',
 8 
 9     # Uncomment the next line to enable the admin:
10     'django.contrib.admin',
11 
12     # Uncomment the next line to enable admin documentation:
13     'django.contrib.admindocs',
14 
15     # 3rd party apps I added:
16     'django_extensions',
17     'bootstrap_toolkit',
18 
19     # My apps:
20     'posts',
21 )

Presenter Notes

MicroBlog: settings

Configuramos la base de datos con sqlite:

 1 DATABASES = {
 2     'default': {
 3         'ENGINE': 'django.db.backends.sqlite3',
 4         'NAME': 'bd.sqlite3',
 5         'USER': '',
 6         'PASSWORD': '',
 7         'HOST': '',
 8         'PORT': '',
 9     }
10 }

Presenter Notes

MicroBlog: views

Microblog/microblog/posts/admin.py:

Para que podamos acceder a los tweets desde el panel de administración(para borrarlos, editarlos, crear nuevos, listarlos), debemos registrar el model en el archivo admin.py:

 1 # -*- coding: utf-8 *-*
 2 from django.contrib import admin
 3 from posts.models import Post
 4 
 5 
 6 class PostAdmin(admin.ModelAdmin):
 7     list_display = ('author', 'message', 'date_posted',)
 8     search_fields = ('author__username', 'message', 'date_posted',)
 9 
10 admin.site.register(Post, PostAdmin)

Presenter Notes

MicroBlog: admin

Habilitamos el admin:

En settings.py, descomentamos esta línea:

1 # 'django.contrib.admin',

En urls.py, descomentamos las siguientes líneas:

1 # from django.contrib import admin
2 # admin.autodiscover()

y esta línea:

1 url(r'^admin/', include(admin.site.urls)),

Presenter Notes

MicroBlog: estructura

La estructura de archivos queda así:

 1 .
 2 |-- bd.sqlite3
 3 |-- manage.py
 4 |-- microblog
 5 |   |-- __init__.py
 6 |   |-- settings.py
 7 |   |-- urls.py
 8 |   `-- wsgi.py
 9 |-- posts
10 |   |-- __init__.py
11 |   |-- admin.py
12 |   |-- forms.py
13 |   |-- models.py
14 |   |-- templates
15 |   |   |-- posts
16 |   |   |   |-- base.html
17 |   |   |   |-- form.html
18 |   |   |   |-- index.html
19 |   |   |   `-- timeline.html
20 |   |   `-- registration
21 |   |       `-- login.html
22 |   |-- tests.py
23 |   `-- views.py
24 `-- requirements.txt
25 5 directories, 18 files

Presenter Notes

MicroBlog: runserver

¡Hora de hacerlo andar!

Sincronicemos nuestros models a la base de datos:

1 MacBookPro:microblog$ python manage.py syncdb

Presenter Notes

Shine on you, crazy.... "microblog" :-P

Corramos el servidor de desarrollo:

1 MacBookPro:microblog$ python manage.py runserver

Presenter Notes

Algunas dulzuras de Django

Presenter Notes

Algunas dulzuras de Django

Forms:

  • Django resuelve de manera clara y prolija el manejo de forms.
  • Form from models

Ejemplo:

 1 from django.forms import ModelForm
 2 
 3 # Create the form class.
 4 class PostForm(ModelForm):
 5     class Meta:
 6     model = Post
 7 
 8 # Creating a form to add a Post.
 9 form = PostForm()
10 
11 # Creating a form to change an existing article.
12 post = Post.objects.get(pk=1)
13 form = PostForm(instance=article)
14 ... <do something>
15 edited_post = form.save()

Presenter Notes

Algunas dulzuras de Django

Validación:

  • En los models, para cada campo
  • Lista de funciones(validators).
  • Cada validator hace un raise de ValidationError si el valor que tomó no cumple cierto criterio.

Ejemplo:

 1 from django.core.exceptions import ValidationError
 2 def validate_even(value):
 3     if value % 2 != 0:
 4         raise ValidationError(u'%s is not an even number' % value)
 5 
 6 # forms.py
 7 from django import forms
 8 class MyForm(forms.Form):
 9     even_field = forms.IntegerField(validators=[validate_even])
10 
11 # models.py
12 from django.db import models
13 class MyModel(models.Model):
14     even_field = models.IntegerField(validators=[validate_even])

Presenter Notes

Algunas dulzuras de Django

ORM: Agregación:

El ORM de Django tiene poderes de super vaca.

  • Entre otra cosas súper interesantes, permite usar agregación.
  • Funciones de agregación: Avg, Max, Min, Count

Ejemplo:

 1 from django.db.models import Avg
 2 
 3 class Book(models.Model):
 4    isbn = models.CharField(max_length=9)
 5    name = models.CharField(max_length=300)
 6    price = models.DecimalField(max_digits=10, decimal_places=2)
 7    authors = models.ManyToManyField(Author)
 8 
 9 from django.db.models import Avg
10 Book.objects.all().aggregate(Avg('price'))
11 >>> {'price__avg': 34.35}

Presenter Notes

Algunas dulzuras de Django

Manejo de fechas:

  • Cómo ser feliz con DateFormat o "Todo lo que siempre quizo poder hacer y siempre se quejó de tener que hacer parcialmente a mano con fechas"

Ejemplo:

 1 import datetime
 2 
 3 from django.utils.dateformat import DateFormat
 4 
 5 d = datetime.datetime.now()
 6 df = DateFormat(d)
 7 
 8 print df.format('jS F Y H:i')
 9 # 23rd April 2014 11:23
10 
11 print df.format('l F jS Y @ H:iA')
12 # Wednesday April 23rd 2014 @ 11:23AM

Presenter Notes

Algunas dulzuras de Django

Aplicaciones de terceros:

  • Para desarrollar con Django existen cienes y cienes de aplicaciones de terceros que podemos usar y que nos ahorran trabajo.

Ejemplos:

  • django-bootstrap-toolkit
  • Django commandline extensions
  • Django registration
  • Django postman
  • Treebeard
  • South
  • django-allauth
  • (¡larguííííísima lista de etcéteras!)

Ver: https://www.djangopackages.com/

Presenter Notes

Respirar profuuuuuuundo!

Presenter Notes

That's all, folks!

monkey

Presenter Notes

¿Preguntas? ¿Comentarios?

Presenter Notes

Crush into Django in 60 minutes!

Ahora que están tan de moda los QR-Codes:

Acá va uno con la url de mi blog:

QR Code

[ http://scoobygalletas.blogspot.com/ ]

Matías Herranz [scoobygalletas@gmail.com]

Presenter Notes

¡Gracias!

Presenter Notes

Crush into Django in 60 minutes!

Referencias útiles:

  • Web oficial del proyecto Django: http://www.djangoproject.com/
  • Djando BootStrap Toolkit: https://github.com/dyve/django-bootstrap-toolkit
  • http://docs.djangoproject.com/en/dev/topics/db/aggregation/
  • http://docs.djangoproject.com/en/dev/ref/validators/
  • http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
  • http://docs.djangoproject.com/en/dev/topics/db/aggregation/
  • Lista de correo: http://groups.google.com/group/django-es
  • Libro en español: http://trac.usla.org.ar/django-book
  • Canal de IRC: #django-es en irc.freenode.net
  • Hice las slides con LandSlide: https://github.com/adamzap/landslide/

Presenter Notes