r10 - 14 Mar 2014 - 12:46:13 - JoseLuisDeLaCruzYou are here: TWiki >  Informatica Web  >  InfInt > DjangoFramework

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

pydev_inst.png

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.

python_inter.png

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

Edit | WYSIWYG | Attach | PDF | Raw View | Backlinks: Web, All Webs | History: r10 < r9 < r8 < r7 < r6 | More topic actions
 
Powered by TWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback