Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/06/2011, 19:11
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: [Aporte] Django Tutorial [Introducción]

Vistas y URLconfs


Tu primera pagina hecha con Django: Hola Mundo!
Una vez que ya tenemos instalado django podemos empezar a jugar. Como primera pagina vamos hacer el popular "Hola mundo!"

Vamos a ver un ejemplo sencillo de como hacer un hola sin un framework:
  1. Creas un archivo de texto plano que contenga "Hola mundo!"
  2. Guardas el archivo con el nombre hola.html
  3. Finalmente, lo subes a tu servidor web y listo.
En este proceso hemos identificado 2 piezas claves para el desarrollo de paginas. La primera es el contenido del archivo en este caso "Hola mundo" y la URL (http://www.example.com/hola.html o tal vez http://www.example.com/files/hola.html if lo pusiste en un subdirectorio).

Con Django, también debes de especificas estas 2 cosas, pero de una manera diferente. El contenido de un archivo es renderizado por una función llamada vista, y la URL es especificada por un URLconf. Primero vamos a escribir la función "hola".


Tu primera vista
En el directorio mysite que hiciste con el comando django-admin startproject, tienes un archivo llamado views.py. Este modulo de Python contendrá las vistas que haremos durante esta entrada. Nota que cuando abras este archivo por primera vez estará vació. Ademas a Django no le importa como se llame este archivo pero por convención lo mantendremos como views.py.

Nuesta vista "Hola mundo" es muy simple, aqui esta un ejemplo de como sería nuestra función:
Código:
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hola mundo")
Vamos a leer el código linea por linea:
Primero, importamos la clase HttpResponse, la cual reside en el modulo django.http. Necesitamos importar esta clase por que la vamos a usar mas adelante en nuestro codigo.
Segundo, definimos una funcion llamada hello - la funcion vista.

Cada funcion vista recibe al menos 1 paramero, llamado request por convención. Este es un objeto que contiene información acerca de la peticion web que fue disparada por esta vista, ademas este objeto es una instancia de la clase django.http.HttpRequest. En este ejemplo no vamos a hacer nada con request, pero este siempre debe de ser el primer parametro en cualquier vista.

Nota que el nombre de la función no importa, no tiene que ser llamada de cierta manera para que Django la reconozca. La estamos llamando hello, por que el nombre claramente indica la esencia de la vista, pero también pudo ser llamada hola_hermoso_bello_mundo o algo igual de repulsivo.

La función es un simple "one-liner": Simplemente regresa un objeto de la clase HttpResponse que has inicializado con el texto "Hola mundo".

Aquí la principal lección es esta: Una vista es una función de Python que toma como primer parámetro un objeto HttpRequest y regresa una instancia de la clase HttpResponse. Para que una función pueda ser una vista Django, necesita hacer estas 2 cosas. (Claro que hay excepciones y vamos a ver estas excepciones después).

Si el lector es lo suficiente agudo pudo darse cuenta que este es básicamente el modelo cliente-servidor.

Tu primer URLconf
Hasta es te punto si corres python manage.py runserver otra vez, todavía vas a ver el mensaje "It worked", sin pista alguna de nuestro "Hola mundo". Y esto es por que nuestro proyecto mysite aun no sabe de la existencia de nuestra vista hello. Necesitamos decirle a Django que estamos activando esta vista en una URL especifica. (Continuando con la analogía de los archivos HTML estáticos, en este momento todavía no hemos subido nuestro archivo al servidor.) Para enlazar una vista a una URL en particular usando Django, usamos un URLconf.

Un URLconf es como una tabla de contenidos para tu sitio hecho con Django. Básicamente es una tabla de relaciones donde describe que función debe de ser llamada cada vez que visitan cierta URL. Por ejemplo cuando alguien visite foo llama a la vista foo_view(), que vive en el modulo views.py.

Cuando ejecutaste django-admin startproject, el script creo un URLconf por ti automáticamente: El archivo urls.py. Por defecto se ve mas o menos asi:

Código:
from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # (r'^admin/', include(admin.site.urls)),
)
Este archivo urls.py por defecto incluye algunas características comentadas usadas por Django, para activar estas características es fácil solo tienes que descomentar las lineas necesarias y listo. Si ignoramos los comentarios entonces tenemos algo mas o menos así.

Código:
from django.conf.urls.defaults import *

urlpatterns = patterns('',
)
Vamos a analizar linea por linea el código.
La primera linea importa todos los objetos de el modulo django.conf.urls.defautls, la cual es la infraestructura de los URLconfs de Django. Esto también incluye una función llamada patterns.
La segunda linea llama a la función patterns y salva su resultado en una variable llamada urlpatterns. La funcion patterns se le pasa un solo argumento - una cadena vacía. (Esto se puede usar como prefijo pero lo veremos mas adelante)

El principal punto a notar aquí es la variable urlpatterns, el cual Django espera encontrar en nuestro modulo de URLconfs. Esta variable define las relaciones entre las URLs y las vistas que manejan estas URLs. Por defecto la URLconf esta vacía. Ademas si el URLconf esta vació Django asume que acabas de crear tu proyecto mostrando el mensaje "It worked!".

Ahora lo único que tienes que hacer es añadir una tupla para definir la relación entre una URL y una vista.
Ejemplo:
Código:
from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
    ('^hello/$', hello),
)
Nosotros hemos quitado los comentarios para brevedad, pero si quieres puedes dejarlos.

Hicimos 2 cambios:
Primero, importamos la función hello de nuestro modulo mysite.views
Segundo, añadimos la linea ('^hello/$', hello), a urlpatterns. A esta linea la vamos a llamar URLpattern.

Ahora vamos a discutir un poco sobre la sintaxis de un URLpattern por que no es obvio a primera vista. A pesar de que queremos hacer coincidir la URL /hello/, el patrón se ve un poco diferente a eso. Vamos a ver porque:

Django quita los slash (/) del el frente de la URL antes de que la cheque con los URLpatterns. Esto significa que nuestro URLpattern no incluye los slash del frente entonces /hello/ quedaría hello/

Los patrones incluyen un circunflejo (^) y el signo de dollar (%). Esto son caracteres especiales de expresiones regulares que tienen un significado especial: El circunflejo (^) significa que "el patrón requiere coincidir desde el inicio de la cadena", por el otro lado el signo de dolar ($) significa que "requiere que el patrón coincida con el final de la cadena".

Este concepto se puede explicar mejor con un ejemplo. Si en vez del patrón '^hello/$' hubiéramos usado '^hello/' (Sin el signo de dolar al final). Entonces cualquier URL que empiece con /hello/ coincidiría, tal como /hello/foo y /hello/bar y no solamente /hello/. Igualmente si hubiéramos usado la expresión 'hello/$' sin el circunflejo al principio entonces coincidiría cualquier cadena que termine en hello/ como /foo/bar/hello/. Si no hubiéramos usado ni el signo de dolar ni el circunflejo solo 'hello/' entonces coincidiría cualquier cadena que contenga 'hello/' tal como /foo/hello/bar. Y es por eso que tan importante usar el circunflejo y el signo de dolar.

La mayoría de los URLpatterns empezaran con un circunflejo y terminaran con signo de dolar pero es importante saber que también podemos hacer patrones mas sofisticados.

Hasta este momento te estarás preguntando que pasaría si alguien hiciera una petición a la URL /hello. Porque nuestro URLpattern requiere un slash al final, esa URL no coincidiría. Sin embargo, por defecto cualquier petición que no coincida con URLpattern y no termine con un slash va ser redireccionado a la misma URL con un slash al final. (Esto es regulado por la variable APPEND_SLASH que puedes encontrar en tu archivo de configuración settings.py.)

Otra cosa que deberías notar acerca de los URLconfs es que hemos pasado la función hello como un objeto sin llamar a la función. Esto es una característica clave de Python (y de muchos otros lenguajes dinámicos): Las funciones son objetos de primera clase, lo que significa que puedes pasarlos como si fuera cualquier otra variable.

Para probar nuestros cambios en el URLconf, inicia el servidor de desarrollo de Django, como lo hiciste anteriormente corriendo el comando (python manage.py runserver). Si lo dejaste corriendo esta bien, no es necesario que lo reinicies, el servidor automáticamente detecta cambios en tu código y recarga lo necesario, entonces no necesitas reiniciar el servidor para ver cambios. El servidor esta corriendo en la dirección http://127.0.0.1:8000/, entonces abre tu navegador web favorito y entra a http://127.0.0.1:8000/hello/. Entonces debes de ver el texto "Hola mundo" - la salida de tu vista hello.