Django: Plataforma de aplicación web. Pruebas en el IFIC
Introducción
Django es un web framework escrito en python para aplicaciones web.
En esta página documentaremos las pruebas que hacemos en el IFIC para ponerlo en marcha como entorno
de nuestras aplicaciones WEB.
La página principal de referencia es la web del proyecto Django que se puede encontrar en
Django home page
Componentes de Django
Estructura del proyecto
mysite/
- init.py: Un archivo requerido para que Python trate a este directorio como un paquete.
- manage.py: Una utilidad de línea de comandos que te deja interactuar con el proyecto de varias formas.
- settings.py: Opciones/configuraciones para el proyecto.
- urls.py: La declaración de las URL para el proyecto; una “tabla de contenidos” del sitio.
Otras características de Django son:
- Un mapeador objeto-relacional. (ORM nativo)
- Un sistema incorporado de "vistas genéricas" que ahorra tener que escribir la lógica de ciertas tareas comunes.
- Un sistema extensible de plantillas basado en etiquetas, con herencia de plantillas.
- Un sistema "middleware" para desarrollar características adicionales; por ejemplo, la distribución principal de Django incluye componentes middleware que proporcionan cacheo, compresión de la salida, normalización de URLs, protección CSRF y soporte de sesiones.
- Soporte de internacionalización, incluyendo traducciones incorporadas de la interfaz de administración.
- Documentación incorporada accesible a través de la aplicación administrativa (incluyendo documentación generada automáticamente de los modelos y las bibliotecas de plantillas añadidas por las aplicaciones).
Instalación
Partimos de una instalación de centos 6.5 con el repositorio epel activado.
Instalamos los paquetes con YUM:
- mysql-server
- MySQL?-python
- python-virtualenv
NO instalamos django com YUM ya que la versión del repositorio es un poco antigua 1.4.8 mientras que la última es la 1.6.1, así que instalamos Djando usando easy-install
# easy-install django
y ya podemos empezar a probar una aplicación.
# django-admin.py startproject djgtest
# cd djgtest
# python manage.py runserver 0.0.0.0:8080
Validating models...
0 errors found
January 21, 2014 - 11:07:51
Django version 1.6.1, using settings 'djgtest.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.
y podemos conectarnos con un navegador y ver si funciona.
Aunque es cómodo probar la instalación inicial en root, no es una buena idea para el
desarrollo. Es mejor usar un usuario no privilegiado con virtualenv. De esta forma podremos
instalar paquetes de python con las versiones adecuadas sin afectar a otros desarrolladores.
Setup de usuario
Una vez creado un usuario para desarrollar en Django, empezamos creando en entorno con
virtualenv:
$ virtualenv --no-site-packages -p python2.6 djgenv
$ source djgenv/bin/activate
$ easy_install django
$ pip list
Comprobamos que podemos crear un proyecto django y que funciona:
$ django-admin.py startproject djgtest
$ cd djgtest
$ python manage.py runserver 0.0.0.0:8080
Recuerda que hay que ejecutar el comando:
source djgenv/bin/activate
cada vez que nos loguemos para disponer del entorno virtual
Lenguaje de templating
Las plantillas de Django pretenden separar la presentación de un documento de sus datos. Normalmente, las plantillas son usadas para producir HTML / XHTML, pero las plantillas de Django son igualmente capaces de generar cualquier formato basado en texto.
Ejemplo
<html>
<head><title>Ordering notice</title></head>
body>
<p>Dear {{ person_name }},</p>
<p>Thanks for placing an order from {{ company }}. It's scheduled to
ship on {{ ship_date|date:"F j, Y" }}.</p>
<p>Here are the items you've ordered:</p>
<ul>
{% for item in item_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% if ordered_warranty %}
<p>Your warranty information will be included in the packaging.</p>
{% endif %}
<p>Sincerely,<br />{{ company }}</p>
</body>
</html>
Análisis del ejemplo
Cualquier texto encerrado por un par de llaves (por ej. {{ person_name }}) es una variable. Esto significa “insertar el valor de la variable a la que se dio ese nombre”.
Cualquier texto que esté rodeado por llaves y signos de porcentaje (por ej. {% if ordered_warranty %}) es una etiqueta de plantilla. La definición de etiqueta es bastante amplia: una etiqueta sólo le indica al sistema de plantilla “haz algo”.
Al final del segundo párrafo de esta plantilla, tenemos un ejemplo de filtro, con el cual puedes alterar la exposición de una variable. En este ejemplo, {{ ship_date|date:"F j, Y" }}, estamos pasando la variable ship_date por el filtro date, tomando el filtro date el argumento "F j, Y". El filtro date formatea fechas en el formato dado, especificado por ese argumento. Los filtros se encadenan mediante el uso de un caracter pipe (|).
También es posible crear tus propios filtros y etiquetas
Uso del sistema de plantillas
Para usar el sistema de plantillas en el código Python hay que realizar lo siguiente:
Crea un objeto Template brindando el código en crudo de la plantilla como una cadena. Django también ofrece un camino para crear objetos Template especificando la ruta al archivo de plantilla en el sistemas de archivos.
Llama al método render() del objeto Template con un conjunto de variables (o sea, el contexto). Este retorna una plantilla totalmente renderizada como una cadena de caracteres, con todas las variables y etiquetas de bloques evaluadas de acuerdo al contexto.
Creación de objetos template
La manera fácil de crear objetos Template es instanciarlos directamente. La clase Template se encuentra en el módulo django.template, y el constructor toma un argumento, el código en crudo de la plantilla.
Ejemplo
>
>> from django.template import Template
>
>> t = Template("My name is {{ name }}.")
>
>> print t
Renderizar una plantilla
Una vez que tienes un objeto Template, le puedes pasar datos brindando un contexto. Un contexto es simplemente un conjunto de variables y sus valores asociados. Una plantilla usa estas variables para llenar y evaluar estas etiquetas de bloque.
Un contexto es representado en Django por la clase Context, ésta se encuentra en el módulo django.template. Su constructor toma un argumento opcional: un diccionario que mapea nombres de variables con valores. Llama al método render() del objeto Template con el contexto para “llenar” la plantilla:
Ejemplo
>
>> from django.template import Context, Template
>
>> t = Template("My name is {{ name }}.")
>
>> c = Context({"name": "Stephane"})
>
>> t.render(c)
'My name is Stephane.
Más informacion.
ORM
...rellenar...
Herramientas de desarrollo
Existen varios entornos que permiten el desarrollo de aplicaciones Django, por ejemplo Eclipse, Netbeans, Aptana o Ninja IDE. En el IFIC, usaremos Eclipse con el plugin pydev que nos permite desarrollar en Python.
Para la capa de acceso a datos, en principio, utilizaremos el ORM nativo de Django junto con el SGBD
MySQL?. Se evaluará la conveniencia de sustituir el ORM nativo de Django por SQLAlchemy.
Para la capa de presentación, existen varias alternativas: Twitter bootstrap (o derivados), YAML, Skeleton, etc.
Análisis más amplio.
Nos decantamos (en principio) por Twitter bootstrap por las siguientes razones:
- Tiene licencia Apache V2.0.
- Responsive design framework.
- Amplia comunidad (es el proyecto más popular en gitbub).
- Utilizado por grandes instituciones (Twitter, Nasa, etc.).
- Posibilidad de usar en otros servicios ya en marcha en el IFIC (Drupal).
- Soporte para los dos preprocesadores de CSS más populares (Less y Sass).
Utilizaremos el software de control de versiones svn, ya disponible en el IFIC.
http://twiki.ific.uv.es/twiki/bin/view/Informatica/RepositoriosSubversion
Como sistema de autenticación y autorización se usará Shibboleth.
Se evaluará la conveniencia de utilizar alguna herramienta case, o bien, instalar algun plugin en eclipse que nos permita diagramar, modelar y hacer un seguimiento de los proyectos.
Debug
Error trace
IDE (Eclipse)
Integración con PyDev
Supongamos que tenemos instalado Eclipse. El paso para instalar
PyDEV? es el siguiente.
Ejecutamos Eclipse como administrador.
Ahora, dentro del IDE, abrimos el menú “Help – Install New Software…” y en la pantalla que aparece añadimos la dirección
http://pydev.org/updates
Nos queda configurar
PyDev para su uso. Abrimos, en Eclipse, el menú “Window – Preferences”, abrimos la sección “Pydev” y nos vamos a “Interpreter – Python”. Configuramos como intérprete el python instalado en virtualenv.
Ya tenemos eclipse preparado para poder desarrollar proyectos en python.
Acceso a múltiples bases de datos
Leer primero
Django Multiple databases
...rellenar con ejemplos si procede...
Sincronización de bases de datos
Routing de bases de datos
Selección manual de base de datos
Ejemplo:
#Usando la base de datos default
Author.objects.all()
#Usando la base de datos default
Author.objects.using('default').all()
#Usando la base de datos other
Author.objects.using('other').all()
Persistencia. Sesiones.
...rellenar...
Autenticación
...rellenar...
Local
Shibboleth
Leer el siguiente
enlace.
Múltiples aplicaciones en el mismo servidor
...rellenar...
Exportación de aplicaciones (Eggs para easy-install)
...rellenar...
Modelo WSGI
Leer la siguiente documentación
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/
Modelo MVC
Django implementa una versión particular del MVC a la que llama MVT (Model View Template).
- M significa “Model” (Modelo), la capa de acceso a la base de datos. Esta capa contiene toda la información sobre los datos: cómo acceder a estos, cómo validarlos y las relaciones entre los datos.
- T significa “Template” (Plantilla), la capa de presentación.
- V significa “View” (Vista), la capa de la lógica de negocio. Esta capa contiene la lógica que accede al modelo y la delega a la plantilla apropiada.
Form widgets
...rellenar...
Generar passwords para usuarios en django
Si hace falta cambiar una password de usuario en django, por ejemplo la del administrador y cambiarla directamente
en la base de datos se puede usar el siguiente procedimiento.
Desde un proyecto que funcione (aunque sea de test mínimo), por ejemplo djgtest
$ python
import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djgtest.settings")
from django.contrib.auth.hashers import PBKDF2PasswordHasher
h=PBKDF2PasswordHasher()
s=h.salt()
h.encode("palabreja",s)
--
JavierSanchez - 21 Jan 2014