Usuario:Administrador/area de tests/slides

De Innovacion

Evolución del desarrollo web

  1. Páginas HTML estáticas
  2. CGI: código para generar páginas web dinámicas:
  3. Código embebido en páginas web (PHP, JSP, ASP, ...)
  4. Frameworks web:
    • RoR, Struts, Symphony
    • Django, Pylons, Web2Py

Django

Django permite a los desarrolladores:

  • crear de forma rápida sitios web de altas prestaciones
  • basados en información almacenada en bases de datos
  • bajo el principio de no repetición (Do Not Repeat Yourself: DRY).
  • Adrian Holovaty, co-creador de Django, es un guitarrista inspirado por Django Reinhardt.

MVC / MVT

MTV: Desarrollo web según un patrón Modelo - Vista - Template (similar al patrón MVC)

  • Modelo: capa de Datos. Describe los datos que gestiona la aplicación. Cada modelo enlaza una tabla en la base de datos.
  • Vista: capa de Negocio. Describe a qué datos hay que acceder y los transforma.
  • Template (plantillas): capa de Presentación. Describe cómo se van a presentar los datos al usuario.

Instalación

  • Comprobamos que está instalado (y la versión)
>>> import django
>>> django.VERSION
(1, 3, 0, 'final', 0)

Creación de un proyecto

$ django-admin.py startproject sitio_encuestas
$ ls -l
sitio_encuestas/
    __init__.py
    manage.py
    settings.py
    urls.py

Creación de un proyecto (cont.)

Un proyecto en Django son 4 ficheros:

__init__.py
Indica que se trata de un paquete.
manage.py
Programa de gestión de django. A partir de ahora será el que usemos para interactuar con el proyecto.
settings.py
Fichero de configuración del proyecto.
urls.py
Gestiona la tabla de urls a las que responde el proyecto.

Servidor web de desarrollo

El proyecto incorpora un servidor web:

$ cd sitio_encuestas
$ python manage.py runserver
Validating models...

0 errors found
Django version 1.3, using settings 'sitio_encuestas.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Servidor web de desarrollo

Comprobamos la dirección con el navegador o

$ curl -I  127.0.0.1:8000
HTTP/1.0 200 OK
Date: Mon, 22 Aug 2011 20:33:33 GMT
Server: WSGIServer/0.1 Python/2.7.1+
Content-Type: text/html

Servidor web de desarrollo (cont.)

Plantilla:Tip

Configuración del proyecto

  • Editar settings.py
  • La configuración necesita rutas absolutas --> truco
import os
def ruta_abs(x):
    return os.path.join(os.path.abspath(os.path.dirname(__file__)), x)

Configuración de la base de datos

Por defecto, tiene sopote para Postgresql, MySQL, Sqlite y Oracle.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Configuración de la base de datos (cont.)

Para usar sqlite:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': ruta_abs('encuestas.db'),                      # Or path to database file if using sqlite3.
    }
}

Para usar otra base de datos: servidor, usuario y base de datos.

configuración regional

TIME_ZONE = 'Europe/Madrid'
LANGUAGE_CODE = 'es-es'

Aplicar los cambios

$python manage.py syncdb

Crea las tablas necesarias para el desarrollo de proyecto, incluyendo todas las aplicaciones incuidas en INSTALLED_APPS

Proyectos y aplicaciones

  • optimizar los recursos
  • un proyecto puede tener varias aplicaciones
  • las aplicaciones se pueden instalar en varios proyectos.
  • Por eso se dice que las aplicaciones de django son "pluglables".

Creación de una aplicación

$ python manage.py startapp encuestas

Esto creará el siguiente directorio:

encuestas/
    __init__.py
    models.py
    views.py

Incluir la aplicación en el proyecto

Hay que añadir la nueva apliación a INSTALLED_APPS dentro de settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'sitio_encuestas.encuestas',
)

Definición de modelos

models.py

from django.db import models
 
class Encuesta(models.Model):
    pregunta = models.CharField(max_length=200)
    fecha_pub = models.DateTimeField(u'fecha de publicación')
 
    def __unicode__(self):
        return self.pregunta

Definición de modelos (cont.)

class Opcion(models.Model):
    encuesta = models.ForeignKey(Encuesta)
    opcion = models.CharField(max_length=200)    
    votos = models.IntegerField()
 
    def __unicode__(self):
        return self.opcion

Ver sql

$ python manage.py sql encuestas
BEGIN;
CREATE TABLE "encuestas_encuesta" (
    "id" integer NOT NULL PRIMARY KEY,
    "pregunta" varchar(200) NOT NULL,
    "fecha_pub" datetime NOT NULL
)
;
CREATE TABLE "encuestas_opcion" (
    "id" integer NOT NULL PRIMARY KEY,
    "encuesta_id" integer NOT NULL REFERENCES "encuestas_encuesta" ("id"),
    "opcion" varchar(200) NOT NULL,
    "votos" integer NOT NULL
)
;
COMMIT;

Syncdb

$ python manage.py syncdb
Creating table encuestas_encuesta
Creating table encuestas_opcion

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 'lm'): lm
E-mail address: lm@micorreo.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
No fixtures found.

Si las tablas tienen datos, ya no modificará la estructura. Soluciones: eliminar los datos de esa aplicación o usar South: http://south.aeracode.org/

Acceso a los datos

$ python manage.py shell
>>> from encuestas.models import Encuesta, Pregunta # Importa las clases del modelo

# No hay encuestas
>>> Encuesta.objects.all()
[]

Acceso a los datos (cont.)

# Creamos una nueva encuesta
>>> import datetime
>>> p = Encuesta(pregunta="¿Cómo va el curso?", fecha_pub=datetime.datetime.now())

# Guardamos el objeto en la base de datos
>>> p.save()

# Creación de ID automática
>>> p.id
1

# Acceso a los valores
>>> p.pregunta
"¿Cómo va el curso?"

Acceso a los datos (cont.)

>>> p.fecha_pub
datetime.datetime(2011, 7, 15, 12, 00, 53)

# Cambio de valores de los atributos
>>> p.pub_date = datetime.datetime(2011, 7, 20, 0, 0)
>>> p.save()

# objects.all() muestra todas las encuestas de la base de datos
>>> Encuesta.objects.all()
[<Encuesta: ¿Cómo va el curso?]

Acceso a los datos (cont.)

  • método __unicode__.
  • Si no, veríamos <Encuesta: Encuesta object>
  • Se crea el método __unicode__ y no __str__ porque los modelos de Django tratan con unicode por defecto.

Acceso a los datos (cont.)

# API de búsquedas de Django
>>> Encuesta.objects.filter(id=1)
[<Encuesta: ¿Cómo va el curso?>]
>>> Encuesta.objects.filter(pregunta__startswith='¿Cómo')
[<Encuesta: ¿Cómo va el curso?>]

# Obtener las encuestas de 2011
>>> Encuesta.objects.get(fecha_pub__year=2011)
<Encuesta: ¿Cómo va el curso?>

Acceso a los datos (cont.)

>>> Encuesta.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Encuesta matching query does not exist.

# Búsqueda por clave primaria
>>> Encuesta.objects.get(pk=1)
<Encuesta: ¿Cómo va el curso?>

# Vamos a insertar unas opciones para ver cómo funcionan las relaciones.
# Podemos crear las opciones desde la misma encuesta:

>>> p = Encuesta.objects.get(pk=1)

Acceso a los datos (cont.)

# Opciones relacionadas con nuestra encuesta:
>>> p.opcion_set.all()
[]

# Creamos tres opciones
>>> p.opcion_set.create(opcion='Muy bien', votos=0)
<Opcion: Muy bien>
>>> p.opcion_set.create(opcion='Bien', votos=0)
<Opcion: Bien>
>>> c = p.opcion_set.create(opcion='Regular', votos=0)

# Los objetos Opción tienen acceso desde la API a la encuesta a la que pertenecen:
>>> c.encuesta
<Encuesta: ¿Cómo va el curso?>

Acceso a los datos (cont.)

<source lang="python">

  1. Y viceversa. Los objetos Encuesta acceden a sus Opciones:

>>> p.opcion_set.all() [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] >>> p.