martes, 11 de marzo de 2014

Tutorial básico de django south



South es una app de django que permite modificar la estructura de la base de datos de una aplicación django cuando cambiamos el modelo (models.py).

El comando syncdb sólo crea nuevas tablas, pero no modifica tablas existentes, así que si en el modelo de una aplicación renombramos un campo de una tabla existente syncdb no realizará ese cambio en la base de datos. A este tipo de cambios en la base de datos se les denomina “migración del esquema” y es de lo que se encarga South.

Instalación

  1. pip install south
  2. Agregar “south” a INSTALLED_APPS
  3. Ejecutar syncdb antes de crear nuestros propios modelos. Está será la última (y única) vez, que necesitamos ejecutar este comando
  4. manage.py syncdb

Usar south en un una app nueva

  1. Crear la aplicación, y empezar a rellenar el models.py
  2. Crear el script de migración inicial
  3. python manage.py schemamigration app_name --initial
  4. Hacer los cambios en la bbdd

    python manage.py migrate app_name

Usar south en una app ya creada


python manage.py convert_to_south app_name

En el caso de que haya otros desarrolladores en el equipo y cada cual esté usando su propia instancia de la base de datos, el resto de desarrolladores ejecutará:

python manage.py migrate app_name --fake


Migración de modelos

  1. Modificamos el models.py de nuestra aplicación
  2. Crear un nuevo script de migración
  3. python manage.py schemamigration app_name --auto
  4. Aplicar la migración a la bbdd

    python manage.py migrate app_name

Como funciona

    Se puede decir que South funciona en varios niveles de abstracción disintos.
  • Añade una tabla en la base de datos que mantiene el estado actual de la base de datos. Es decir, guarda que migraciones se han aplicado.
  • Crea un directorio en la applicación, donde guarda para cada migración un fichero (script) con la información necesaria para realizarla
  • Añade varios comandos al manage.py

Los ficheros de migración generados en deben subirse al repositorio para que el resto de los desarrolladores pueda también realizar la migración.

Referencias

domingo, 9 de marzo de 2014

Usando Flatpages

Flatpages

A menudo tendrás una aplicación Web impulsada por bases de datos ya funcionando, pero necesitarás agregar un par de páginas estáticas, tales como una página Acerca de o una página de Política de Privacidad. Sería posible usar un servidor Web estándar como por ejemplo Apache para servir esos archivos como archivos HTML planos, pero eso introduce un nivel extra de complejidad en tu aplicación, porque entonces tienes que preocuparte de la configuración de Apache, tienes que preparar el acceso para que tu equipo pueda editar esos archivos, y no puedes sacar provecho del sistema de plantillas de Django para darle estilo a las páginas.
La solución a este problema es la aplicación flatpages de Django, la cual reside en el paquete django.contrib.flatpages. Esta aplicación te permite manejar esas páginas aisladas mediante el sitio de administración de Django, y te permite especificar plantillas para las mismas usando el sistema de plantillas de Django. Detrás de escena usa modelos Django, lo que significa que almacena las páginas en una base de datos, de la misma manera que el resto de tus datos, y puedes acceder a las flatpages con la API de bases de datos estándar de Django.
Las flatpages son identificadas por su URL y su sitio. Cuando creas una flatpage, especificas con cual URL está asociada, junto con en cuál(es) sitio(s) está (para más información acerca de sitios, consulta la sección “Sites”).

Usar flatpages

Para instalar la aplicación flatpages, sigue estos pasos:
  1. Agrega 'django.contrib.flatpages' a tu INSTALLED_APPSdjango.contrib.flatpages depende de django.contrib.sites, asi que asegúrate de que ambos paquetes se encuentren enINSTALLED_APPS.
  2. Agrega 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' a tu variable de configuración MIDDLEWARE_CLASSES.
  3. Ejecuta el comando manage.py syncdb para instalar las dos tables necesarias en tu base de datos.
La aplicación flatpages crea dos tablas en tu base de datos: django_flatpage y django_flatpage_sitesdjango_flatpage simplemente mantiene una correspondencia entre URLs y títulos más contenido de texto.django_flatpage_sites es una tabla muchos a muchos que asocia una flatpage con uno o más sitios.
La aplicación incluye un único modelo FlatPage, definido en django/contrib/flatpages/models.py. El mismo se ve así:
from django.db import models
from django.contrib.sites.models import Site

class FlatPage(models.Model):
    url = models.CharField(maxlength=100)
    title = models.CharField(maxlength=200)
    content = models.TextField()
    enable_comments = models.BooleanField()
    template_name = models.CharField(maxlength=70, blank=True)
    registration_required = models.BooleanField()
    sites = models.ManyToManyField(Site)
Examinemos cada uno de los campos:
  • url: La URL donde reside esta flatpage, excluyendo el nombre del dominio pero incluyendo la barra (/) inicial (por ej. /about/contact/).
  • title: El título de la flatpage. El framework no usa esto para nada en especial. Es tu responsabilidad visualizarlo en tu plantilla.
    content: El contenido de la flatpage (por ej. el HTML de la página). El framework no usa esto para nada en especial. Es tu responsabilidad visualizarlo en tu plantilla.
  • enable_comments: Indica si deben activarse los comentarios e esta flatpage. El framework no usa esto para nada en especial. Puedes comprobar este valor en tu plantilla y mostrar un formulario de comentario si es necesario.
  • template_name: El nombre de la plantilla a usarse para renderizar esta flatpage. Es opcional; si no se indica o si esta plantilla no existe, el framework usará la plantilla flatpages/default.html.
  • registration_required: Indica si se requerirá registro para ver esta flatpage. Esto se integra con el framework de autenticación/usuarios de Django.
  • sites: Los sitios en los cuales reside esta flatpage. Esto se integra con el framework sites de Django, el cual se trata en la sección “Sites” en este capítulo.
Puedes crear flatpages ya sea a través de la interfaz de administración de Django o a través de la API de base de datos de Django. Para más información, examina la sección “Agregar, modificar y eliminar flatpages”.
Una vez que has creado flatpages, FlatpageFallbackMiddleware se encarga de todo el trabajo. Cada vez que cualquier aplicación Django lanza un error, este middleware verifica como último recurso la base de datos de flatpages en búsqueda de la URL que se ha requerido. Específicamente busca una flatpage con la URL en cuestión y con un identificador de sitio que coincida con la variable de configuración SITE_ID.
Si encuentra una coincidencia, carga la plantilla de la flatpage, o flatpages/default.html si la flatpage no ha especificado una plantilla personalizada. Le pasa a dicha plantilla una única variable de contexto: flatpage, la cual es el objeto flatpage. Usa RequestContext para renderizar la plantilla.
Si FlatpageFallbackMiddleware no encuentra una coincidencia, el proceso de la petición continúa normalmente.
Nota
Este middleware sólo se activa para errores 404 (página no encontrada) – no para errores 500 (error en servidor) u otras respuestas de error. Nota también que el orden de MIDDLEWARE_CLASSES es relevante. Generalmente, puedes colocar el FlatpageFallbackMiddleware cerca o en el final de la lista, debido a que se trata de una opción de último recurso.

Agregar, modificar y eliminar flatpages

Puedes agregar, cambiar y eliminar flatpages de dos maneras:

Vía la interfaz de administración

Si has activado la interfaz automática de administración de Django, deberías ver una sección “Flatpages” en la página de índice de la aplicación admin. Edita las flatpages como lo harías con cualquier otro objeto en el sistema.

Vía la API Python

Como ya se describió, las flatpages se representan mediante un modelo Django estándar que reside en django/contrib/flatpages/models.py. Por lo tanto puede acceder a objetos flatpage mediante la API de base de datos Django, por ejemplo:
>>> from django.contrib.flatpages.models import FlatPage
>>> from django.contrib.sites.models import Site
>>> fp = FlatPage(
...     url='/about/',
...     title='About',
...     content='<p>About this site...</p>',
...     enable_comments=False,
...     template_name='',
...     registration_required=False,
... )
>>> fp.save()
>>> fp.sites.add(Site.objects.get(id=1))
>>> FlatPage.objects.get(url='/about/')
<FlatPage: /about/ -- About>

Usar plantillas de flatpages

Por omisión, las flatpages son renderizadas vía la plantilla flatpages/default.html, pero puedes cambiar eso para cualquier flatpage con el campo template_name en el objeto FlatPage.
Es tu responsabilidad el crear la plantilla flatpages/default.html. En tu directorio de plantillas, crea un directorio flatpages que contenga un archivo default.html.
A las plantillas de flatpages se les pasa una única variable de contexto: flatpage, la cual es el objeto flatpage.
Este es un ejemplo de una plantilla flatpages/default.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
    "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>


fuentes:

http://django-book.mkaufmann.com.ar/chapter14.html#flatpages

viernes, 7 de marzo de 2014

Como trabajar sin conexion en Google Chrome


Hoy trabajando con un amigo, vi que desconecto su conexión wifi para probar una pagina que había descargado para su maquina. Y le comente que los navegadores tienen esa opción. Para trabajar "sin conexión". Bueno, mejor rectifico lo que le dije con este post, Firefox y IExplorer tienen. Chrome no lo tiene, y lo siento para los seguidores de Safari pero no indague sobre Safaris ;) .

Bueno para Chrome hay una manera, aunque parece un poco "tricky", explicare primero para IE y para Firefox ya que son un pastel comido :) . Empecemos por orden de calidad :P :

FireFox - se hace click en el botón FireFox y después seleccionamos Desarrollador Web ( o en ingles, Web developer, o en frances, Dévelopement web ) y despues seleccionas en Trabajar sin conexion (o en ingles, "Work Offline", o en frances 'Travailler hors connexion' ) .

Internet Explorer- Seleccionamos 'Herramientas' y después "Trabajar sin conexión"

En Chrome no hay un botón de "trabajar sin conexión" pero podemos conseguir el mismo objetivo con un poco de magia.

Una forma efectiva y menos dolorosa que desconectarse y volverse a conectarse de la red, es crear un servidor proxy que apunte a tu propria PC. Pero el secreto esta en hacerlo desde chrome solamente, ya que de esta manera evitarías que otros programas que usen internet se desconecten y demás.

Hay muchas extensiones disponibles para Chrome, pero muchas están diseñadas para cosas privadas y simplemente redireccionar el trafico sobre internet, para proveer un poco de anonimato. La extensión que voy a usar aquí se llama: "Quick & Dirty Proxy Flipper", para descargarlo e instalarlo haga click aquí.

Una vez instalado, aparecerá el icono del servidor proxy.






Selecciona http://localhost:8080 a no ser que seas un desarrollador y estés corriendo algún servidor en esa dirección. De esa manera ya estarás offline, también es importante tener en cuenta de que Chrome tiene una memoria Cache y algunas cosas parecerán tener acceso a internet, pero en realidad no es asi.


Para volver a la normalidad basta con ir a la extensión y seleccionar la opción system.


Espero que les haya ayudado ;)