Este tutorial está basado en el "Django book".
Cualquier duda, comentario o sugerencia aquí.
Antes que empieces a leer este grandioso tutorial, voy a necesitar que cumplas con unos pequeños requisitos.
- Experiencia programación: Conceptos básicos como variables, estructuras de control (ejemplo: if, for, while), estructura de datos (listas, tuplas, diccionarios), clases y objetos y por supuesto programación orientada a objetos.
- Experiencia programando en python: Django es una colección de librerías escritas en python. Entonces para desarrollar sitios usando django tienes que escribir código en python. En caso de que no sepas programar en python estas de suerte por que aprender a programar en python es un placer, cosas que te pueden llevar varias lineas de código en otros lenguajes con python puedes hacerlo de una manera simple y en pocas lineas. Si buscas libros para aprender python te recomiendo "Python para todos" o "Dive into python".
¿Qué es un web framework?
Django es un prominente miembro de una nueva generación de web frameworks - pero ¿que es lo que este termino precisamente significa?
Para contestar esta pregunta, vamos a considerar el diseño de una aplicación web escrita en python sin un framework. A través de este tutorial, vamos a tomar este enfoque de trabajar sin frameworks o atajos y después ver como lo haríamos con atajos.
Una de las maneras mas simples y directas de construir una aplicación web escrita en python sin utilizar ningún framework es usar CGI (Common Gateway Interface) estándar, que fue una técnica muy popular a finales de los 90's para desarrollar paginas web dinámicas y no simplemente HTML estático.
Aquí una explicación de alto nivel de como funciona: Solo crea un script en python que imprima HTML, luego salva el script en un servidor web con la extensión ".cgi" y visita la pagina desde tu explorador web favorito. Y eso es todo.
Aquí un ejemplo de Python CGI (Suponga que funciona):
Código Python:
Ver original
#!/usr/bin/env python import MySQLdb print "Content-Type: text/html\n" print "<html><head><title>Books</title></head>" print "<body>" print "<h1>Books</h1>" print "<ul>" connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') cursor = connection.cursor() cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10") for row in cursor.fetchall(): print "<li>%s</li>" % row[0] print "</ul>" print "</body></html>" connection.close()
Como pueden ver lo primero que hace es imprimir "Content-Type: text/html" seguido de una linea en blanco después imprimir algo de html, hace una conexión a una base de datos, obtiene algunos registros y los imprime formateado con html, termina de imprimir el html y cierra la conexión.
Con una pagina como esta, el escribir todo desde 0 no es necesariamente malo. Este código es simple de comprender - inclusive un programador novato puede leer estas 16 lineas de código de python y entender todo, de principio a fin. Como pueden observar no hay mucho que aprender y no hay otro código mas que leer. Ademas es simple de llevar a producción: Solo salva el código en un archivo que tenga la extensión ".cgi", sube el archivo al servidor web y visita la pagina desde tu explorador.
Pero a pesar de su simplicidad, este enfoque tiene números problemas y fastidios. Solo pregúntate a ti mismo las siguientes preguntas:
- ¿Que pasa cuando múltiples partes de la aplicación necesitan estar conectadas a la base de datos? Seguramente ese código para conectar a la base de datos no necesitaría ser duplicado en cada script CGI que hagamos. Lo ideal sería refactorizar el código en una función compartida para conectarnos a la base de datos.
- Debe el desarrollador realmente preocuparse acerca de imprimir la linea "Content-Type" y recordar cerrar la conexión a la base de datos? Este tipo de asuntos reduce la productividad de un programador e introduce oportunidades para errores.
- ¿Que pasa cuanto el código es reutilizado en múltiples ambientes, cada uno con una base de datos y contraseñas separadas? En este punto, algunas configuraciones de ambientes específicos se vuelven esenciales.
- ¿Que pasa cuando un diseñador web sin experiencia codificando en Python desea rediseñar la pagina? Un carácter mal puesto y la aplicación entera puede fallar. Idealmente, la lógica de la pagina - el obtener registros de libros de la base de datos - debería de estar separada del HTML que despliega la pagina, entonces el diseñador puede editar el html sin afectar la lógica de la aplicación.
Estos problemas son precisamente los problemas que un web framework trata de resolver. Un web framework provee de una infraestructura para programar tus aplicaciones, ademas de que te puedes concentrar en escribir código limpio y mantenible sin tener que reinventar la rueda. En pocas palabras eso es lo que Django hace.
El diseño del patrón MVC
Vamos a ver un rapido ejemplo que demuestra la diferencia entre el anterior y un enfoque con un web framework. Aquí esta como mas o menos se escribiría el anterior codigo de CGI usando Django. Y la primera cosa que notamos es que dividimos todo el 4 archivos (models.py, views.py, urls.py) y un template HTML (latest_books.html):
Código Python:
Ver original
# models.py (the database tables) from django.db import models class Book(models.Model): name = models.CharField(max_length=50) pub_date = models.DateField() # views.py (the business logic) from django.shortcuts import render_to_response from models import Book def latest_books(request): book_list = Book.objects.order_by('-pub_date')[:10] return render_to_response('latest_books.html', {'book_list': book_list}) # urls.py (the URL configuration) from django.conf.urls.defaults import * import views urlpatterns = patterns('', (r'^latest/$', views.latest_books), ) # latest_books.html (the template) <html><head><title>Books</title></head> <body> <h1>Books</h1> <ul> {% for book in book_list %} <li>{{ book.name }}</li> {% endfor %} </ul> </body></html>
Otra vez, no te preocupes de la sintaxis; solo trata de entender el diseño general. La principal cosa a notar aquí es la separación de asuntos:
- El archivo models.py contiene una descripción de las tablas de la base de datos, representadas por una clase. Esta clase es llamada un modelo. Usándola puedes crear, obtener, actualizar y borrar registros en tu base de datos usando simple código Python en vez de escribir una sentencia SQL que puede ser repetitiva.
- El archivo views.py contiene la lógica del negocio para la pagina. La función latest_book es llamada una vista.
- El archivo urls.py especifica que vista debe ser llamada dado un patron de URL. In este caso, la URL /latest/ sera manejada por la función latest_books(). En otras palabras, si tu dominio es example.com, cualquiera que visite http://example.com/latest/ va a llamar a la función latest_books().
- El archivo latest_books.html es un template (o plantilla) que describe el diseño de la pagina, usando un lenguaje de template con básicas sentencias lógicas - ejemplo {% for book in book_list %}.
Si tomamos todas las piezas y las juntamos aproximadamente siguen un patron llamado MVC (Model-View-Controller).
La ventaja clave de tal enfoque es que los componentes son loosely coupled. Cada pieza de una aplicación web hecha con Django tiene un solo propósito clave y puede ser cambiado independientemente sin afectar las otras piezas. For ejemplo, un desarrollador puede cambiar la URL de cierta parte de la aplicación sin afectar las otras piezas de la aplicación. Un diseñador puede cambiar el HTML de un template (o plantilla) sin tener que tocar el código de python. Un administrador de base de datos puede renombrar una tabla de la base de datos y especificar el cambio en un solo lugar, en vez de tener que buscar y reemplazar a través de una docena de archivos.