Plantillas para las apps de Django

Con la reciente llegada de Django 1.4 y su flagrante lista de novedades, se ha incorporado una útil funcionalidad en los comandos startapp y startproject para utilizar plantillas, y recrear la estructura que utilizamos habitualmente en nuestras apps.

En mi caso la estructura generalmente suele ser muy similar a la siguiente:

.
└── app_name
    ├── admin.py
    ├── forms.py
    ├── __init__.py
    ├── models.py
    ├── search_indexes.py
    ├── static
    │   ├── css
    │   │   └── sass
    │   ├── graphics
    │   └── js
    │       └── coffee
    ├── templates
    │   ├── app_name
    │   ├── search
    │   │   └── indexes
    │   │   └── app_name
    │   │   └── mymodel_text.txt
    │   └── templatetags
    ├── templatetags
    │   ├── __init__.py
    │   └── tt_app_name.py
    ├── tests.py
    ├── urls.py
    └── views.py

Ahora con la opción –template de startproject y startapp, es muy sencillo crear esta estructura cada vez que comienzas a trabajar en una nueva app.

./manage.py startapp --template=/path/to/template/django_templates/app_name nueva_app

De forma inteligente el comando sustituirá todas las apariciones de app_name en los nombres de los archivos por el nombre de la nueva aplicación, que en este caso es “nueva_app”.

Por ejemplo, al crear una app llamada “encuestas”  el archivo tt_app_name.py sería renombrado a: “tt_encuestas.py”

También procesará todos los archivos *.py utilizando el lenguaje de plantillas de Django para realizar las siguientes sustituciones:

  • Cualquier opción que pasemos al comando startapp
  • app_name por el nombre de la nueva app
  • app_directory por la ruta completa de la nueva app

Otro pequeño detalle de Django que facilita la vida a los desarrolladores.

Más información en la documentación de éstos comandos.

Como configurar rope y ropevim con Django y virtualenv

En el directorio de configuración de Rope:

  1. Abrimos el archivo de configuración de Rope:
    vim .ropeproject/config.py
  2. Aproximadamente el la línea 37, añadimos:
prefs.add('python_path', 'env/lib/python2.6/site-packages/')

Suponiendo que el directorio virtual esté en “env/” y que se haya instalado la versión 2.6 de Django. Si tenéis el entorno virtual en otro directorio simplemente hay que sustituir la ruta.

En este momento ya es posible utilizar la funcion RopeGoToDefinition() (C-c r a g) para ir a la definición de una clase o método de Django o alguna de las apps instaladas.o incluso ver la ayuda (C-c r a d) de cualquier librería de forma rápida y sin salir de vim.

Enlaces:

Mis plugins de vim

Hoy quiero compartir los plugins de vim que tengo instalados en mis equipos y como me ayudan en el trabajo diario.

Vim es en mi opinión el mejor editor de textos jamás creado (con todos mis respetos para emacs, otro gran editor). A pesar de que la curva de aprendizaje es elevada, una vez que se comienza a dominar su funcionamiento el aumento de la productividad es realmente impresionante. Cualquier persona que os vea trabajar con vim se quedaría con la boca abierta al ver la agilidad con la que es posible desenvolverse en la edición de textos.

La documentación de vim es una de las más extensas que conozco, y a parte de eso, existen muchos libros y recursos sobre vim en internet. Uno de mis favoritos es la genial serie de screencasts  de Derek Wyatt que te introducen a vim desde el nivel de novato hasta convertirte en un experto. Podéis encontrar los vídeos en su web.

No es que vim sea un editor que necesite funcionalidades extra en forma de plugins para resultar útil y/o productivo sino que los plugins mejoran determinados aspectos muy concretos o añaden herramientas extra que nos ayudan en determinadas tareas.

Y ahora, centrándonos en el tema principal del post, voy a pasar a comentar los plugins que tengo instalados:

Taglist: Extrae la estructura de de varios lenguajes de programación facilitando la navegación por el código fuente del mismo.

NERDCommenter: Este fabuloso plugin tiene diferentes comandos para comentar líneas de código fuente, sea cual sea el lenguaje de programación. Yo he asociado la tecla <F3> a este plugin, y solo con pulsarla detecta el lenguaje de programación en el editor y lo comenta adecuadamente.

snipMate: Es difícil explicar el potencial de este plugin. Lo que hace en realidad es insertar snippets en el código de forma inteligente en función del contexto. Lo mejor es ver un vídeo: http://vimeo.com/3535418

NerdTree: Este plugin muestra un árbol de directorios y archivos y permite la manipulación de los mismos de forma rápida, al más puro estilo vim. Tiene muchas características que lo hacen indispensable.

bufExplorer: Sencillo y efectivo plugin para seleccionar y visualizar los buffers abiertos. No es realmente necesario, y vim dispone de comandos que hacen prácticamente lo mismo, y quizás mejor.

Command-t: Conocí recientemente este plugin gracias a un tweet de JaviSantana, y ha sido una de las sorpresas más agradables que he descubierto recientemente. Nos ayuda a abrir ficheros de una forma muy eficiente y original, es casi como si nos leyera el pensamiento, y con dos o tres caractéres es capaz de saber que archivo queremos abrir. Espectacular.

vcscommand: Una interfaz común para diversos VCS como: cvs, svn, svk, git, bzr, y mercurial.

git: Comandos integrados para interactuar con git desde vim.

ropevim: Estupenda integración de vim con rope. Para los que trabajamos con Python intensivamente. Incluye herramientas de refactoring, reestructuración, autocompletado, documentación en línea, saltos a definiciones, organiza imports de forma automática, etc…

supertab: Une todas las formas de autocompletado de vim en una sola tecla, el tabulador, y además las selecciona de forma inteligente en función del contexto. Una pequeña mejora al impresionante sistema de autocompletado de vim.

diffchanges: Acabo de instalar este plugin hace unas horas, y ha sido la inspiración para este post. Muestra las diferencias en formato visual de un archivo antes de editarlo y después. Puedes verlo en formato patch o vimdiff (gráfico)

latex-suite: La suite de LaTeX se merece un blog por si sola. Si utilizais LaTeX, es imprescindible. Ayuda enormemente a la generación de documentos. Un gigante.

xml: Una gran colección de herramientas para los que trabajamos con xml, xhtml, xsl, etc… Permite por ejemplo renombrar rápidamente etiquetas xhtml, cambiar sus atributos, envolver un área de código con una etiqueta, folding, fusión de tags adyacentes, y muchas cosas más. Muy útil.

python_fn: Como su nombre indica, este plugin nos ayuda a trabajar con python. Permite seleccionar bloques, clases, funciones, navegar rápidamente entre clases y funciones, etc…

matchit: En vim podemos seleccionar caracteres asociados mediante la tecla % por ejemplo, en: “(3+2)” si el cursor está en el primer paréntesis, pulsando % el cursor salta al paréntesis de cierre. Este plugin extiende ese comportamiento a etiquetas html, xhtml, ada, asp, latex, pascal, csh, lua… y la lista continúa.

En resumen: Es un placer trabajar con vim una vez que empiezas a dominar todo su potencial. Es un editor que hace cosas que nunca hubieras ni imaginado, y en mi opinión es uno de los mejores programas de software existentes.

Mi recomendación final para los que no conozcan vim: Invierte tiempo en aprender y no te arrepentirás.

Las novedades que traerá Django 1.3

Todavía no ha salido la versión 1.3 de Django, pero las novedades que traen prometen agradar a los desarrolladores. Llevo tiempo usando la versión de desarrollo 1.3 en entornos de pruebas, trasteando con algunas de sus características, y la verdad es que mi valoración es muy positiva.

Las principales características de la nueva versión son:

Tras el gran número de novedades que incorporó en su momento la versión 1.2, querían que la versión 1.3 se centrara en dotar de más estabilidad al framework, evitando añadir grandes mejoras, y trabajar únicamente en funcionalidades que no requieran una gran modificación en el nucleo. Es cierto que las novedades que traerá la versión 1.3 no son tan abundantes como la fantástica v1.2, pero el trabajo que se está realizando es excelente.

Logging

Django se integra ahora con la herramienta de logging de Python. Es cierto que configurar un buen sistema de logging lleva su tiempo, especialmente para sitios grandes, pero tiene sus ventajas.

Ahora es más sencillo registrar eventos que ayuden a determinar el comportamiento de la web, y los usuarios de la misma, además, se incorpora un nuevo Handler: AdminEmailHandler que es muy útil para enivar un email a los administradores.

De esta forma, se puede configurar un warning en una vista que procesa los datos de un TPV como este:

logging.warning('Solicitud sospechosa de ataque')

registrando en un archivo de registro toda la información de la petición, y a su vez incluyéndola en un email enviado automáticamente a los administradores.

Una gran herramienta capaz de ayudar a mejorar la seguridad y rendimiento de nuestros sitios web.

Generic views basadas en clases

Nunca he sido partidario de utilizar las vistas genéricas de Django. Están diseñadas para cosas sencillas, y generalmente trae quebraderos de cabeza integrarlas con sistemas de permisos, u objetos dependientes.

Tras estudiar las vistas genéricas basadas en clases, mi opinión ha cambiado. Ahora es posible implementar lógicas mucho más complejas sobrescribiendo métodos, permitiéndonos alcanzar un grado de personalización al que no se podía aspirar antes. No solo eso, sino que con un diseño apropiado, puedes crear tus propias clases genéricas, basadas en los mixins incluidos.

Ya hemos utilizado estas vistas en un proyecto de tamaño considerable y la verdad es que estoy satisfecho con el resultado. Tras haber creado unas clases genéricas personalizadas, ahora la mayoría de las vistas pueden ser subclases de éstas, apostando más fuerte todavía por el DRY y KISS.

Pero no todo es positivo en estas vistas genéricas. Me costó bastante entender el funcionamiento dentro del código de Django. No está nada claro y creo que se debería mejorar el árbol de clases actual, y permitir mezclas entre diferentes mixins como MultipleObjectMixin y SingleObjectMixin. De todas formas hay que ser justos, y reconocer que no está nada mal para una primera versión.

Aplicación de archivos estáticos

Esto probablemente no será nada nuevo para muchos desarrolladores de Django, especialmente para aquellos que utilizabamos la aplicación django-staticfiles de jezdez.

Esta aplicación pasa a formar parte del framework dentro de contrib. Los pasos para migrar de django-staticfiles a la aplicación actual se muestran en la propia documentación de django.

El funcionamiento es prácticamente el mismo. Para los que no lo conozcan, es el momento de empezar a utilizarlo. Lo que hace es recopilar todos los archivos estáticos de la web, y ponerlos en un lugar común, bien sea un CDN o un directorio utilizado por nginx para servir los contenidos. Es casi de obligado uso en sitios de gran volumen de tráfico.

Staticfiles es una buena aplicación, aunque recientemente también estoy probando en algunos proyectos django-mediagenerator que es prácticamente igual que staticfiles, solo que es capaz unir, minimizar y comprimir los archivos CSS y JavaScript de la web. Muchos de nuestros proyectos ya tienen una rama  en git para probar y evaluar el rendimiento django-mediagenerator.

Con la reciente liberación por parte de Google de mod_pagespeed, es posible conseguir resultados similares a django-mediagenerator con la aplicación de staticfiles, pero esto es otro debate. Hay que tener en cuenta que el módulo de Google es para apache, y cada vez más sitios utilizan nginx como servidor web, además de que cada día surgen más proyectos que recomiendan utilizar nginx, como por ejemplo gunicorn: el unicornio verde.

Conclusión

Las novedades de Django 1.3 van a ser realmente útiles para todos los seguidores de este fantástico framework de desarrollo web.

¡No dejéis de probarlo!

Documentar projectos de Django con Sphinx

Sphinx es un excelente software para documentar proyectos, especialmente los que están basados en python.

Es posible que si has intentado utilizarlo en proyectos de Django obtengas un error que diga:

autodoc can't import/find module '', it reported error:
"Settings cannot be imported, because environment variable
DJANGO_SETTINGS_MODULE is undefined.",please check your spelling
and sys.path

Para solucionarlo hay que importar las settings de Django, introduciendo el siguiente código en el archivo conf.py:

sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/../../'))
import settings
from django.core.management import setup_environ

setup_environ(settings)

Esto hace que sphinx lea las settings de nuestro proyecto.

Bienvenidos

El blog comienza una nueva aventura, esperamos que os resulte interesante.

FireStats icon Con la potencia de FireStats