Skip to content

Definiendo nuestra aplicación: Especificaciones, relaciones y modelos

08-jul-09

Cómo comente en el post anterior, intentaremos desarrollar una aplicación web algo compleja, por lo tanto, creo que lo mejor es, que desde el principio, definamos claramente lo que queremos. Por lo tanto, detallaremos las especificaciones que necesitamos para desarrollar Classifieds:

  • Los usuarios crean los anuncios y estos pueden estar o no registrados (la diferencia estriba, en que los usuarios registrados, dispondran de un panel de administración de sus anuncios).
  • Los usuarios podrán publicar anuncios de particulares y de empresas.
  • Los anuncios estarán clasificados por subcategorias, categorias y tipos de anuncio (se compra, se vende, se alquila, se traspasa, etc…)
  • Los anuncios estarán ubicados por paises, estados/comunidades autónomas y ciudades/provincias.
  • Los anuncios son siempre validados por un editor/administrador de la aplicación web.

Estas son a groso modo las principales especificaciones de nuestra aplicación, aunque no descarto que se vayan incrementando a medida que vayamos avanzando en su desarrollo (procuraré actualizar esta entrada si esto sucede).

Ahora antes de definir las relaciones existentes entre los distintos tipos de datos y sus modelos, veamos el siguiente diagrama donde se muestra de forma gráfica estas relaciones:

classifieds

Las relaciones entre los distintos modelos de datos son las siguientes:

  1. Un usuario solo puede ser un tipo de usuario (particular o empresa) y de un tipo de usuario existen muchos usuarios.
  2. Un tipo de usuario, puede tener uno o muchos anuncios, pero un anuncio sólo puede pertener a un tipo de usuario.
  3. Un anuncio pertenece a un tipo de anuncio (Se compra, Se vende, Se alquila, etc…) y un tipo de anuncio puede tener uno o muchos anuncios.
  4. Un anuncio pertenece a una ciudad o provincia y una ciudad o provincia puede tener muchos anuncios.
  5. Una ciudad o provincia pertenece a un estado o comunidad autónoma, pero un estado o comunidad autónoma puede tener una o muchas ciudades/provincias.
  6. Un estado o comunidad autónoma pertenece a un país, y un país puede tener una o muchos estados/ccaa.
  7. Un anuncio pertenece a una subcategoría y una subcategoría puede tener muchos anuncios.
  8. Una subcategoria pertenece a una categoría y una categoría puede tener muchas subcategorías.

ACTUALIZACIÓN: 05/08/2009

Añadimos un modelo más que recogerá la información adicional de los anuncios, como imagenes, videos y/o mapas. La relación con anuncio es también de 1:n. Es decir, un anuncio puede tener mucha información adicional y mucha información adicional pertenece a un solo anuncio.

Como vemos todas las relaciones son uno a muchos (1:n).

Ahora estamos en condiciones de crear nuestra aplicación en el proyecto Classifieds.

Para crear una aplicación nueva dentro del proyecto ejecutamos

python manage.py startapp advertisements

Este comando crea el directorio advertisements y los ficheros:

imagen-21

  • __init__.py: Define nuestro directorio como un módulo Python válido.
  • models.py: Aquí se definen los modelos u objetos que serán mapeados a una base de datos relacional (en nuestro caso PostgreSQL).
  • views.py: Define las funciones que van a responder a las urls entrantes.

Creo que en este momento es interesante, saber distinguir proyecto de aplicación, porque cómo bien se indica en el Libro de Django es algo que hace confundir a los principiantes como yo. Copio literalmente:

  • Un proyecto es una instancia de un cierto conjunto de aplicaciones de Django, más las configuraciones de esas aplicaciones. Técnicamente, el único requerimiento de un proyecto es que este suministre un archivo de configuración, el cual define la información hacia la conexión a la base de datos, la lista de las aplicaciones instaladas, la variable TEMPLATE_DIRS, y así sucesivamente.
  • Una aplicación es un conjunto portable de una funcionalidad de Django, típicamente incluye modelos y vistas, que conviven en un solo paquete de Python. Por ejemplo, Django incluye un número de aplicaciones, tales como un sistema de comentarios y una interfaz de administración automática. Una cosa clave para notar sobre estas aplicaciones es que son portables y reusables en múltiples proyectos.

En la siguiente entrada, ya comenzaremos a escribir algo de código para dar forma a nuestros modelos de datos (models.py) en Python.

Comenzamos con el proyecto: Classifieds

07-jul-09

Ahora que ya tenemos todo instalado y configurado, nos ponemos manos a la obra con nuestro proyecto. La idea es que este, sea un proyecto totalmente funcional, es decir, que podamos luego poner en producción, de hecho será la nueva versión de un sitio de anuncios clasificados existente. Para seguir un orden y no perdernos, tomaremos como referencia guía el Libro de Django 1.0.

Lo primero que tenemos que hacer es crear nuestro proyecto, lo situamos fuera del root del servidor web, por dos motivos:

  1. Porque no es necesario, ya que Django dispone de su propio servidor de desarrollo
  2. Porque, si lo situamos en el servidor de documentos web, corremos el riesgo de que nuestro código esté accesible mediante web.

Por lo tanto, abrimos una sesión en Terminal y no situamos por ejemplo en nuestra carpeta y creamos nuestro proyecto con django-admin.py:

cd $home
django-admin.py startproject classifieds

Según el Django Book:

Un proyecto es una colección de configuraciones para una instancia de Django, incluyendo configuración de base de datos, opciones específicas de Django y configuraciones específicas de aplicaciones.

Ahora vamos a ver cual ha sido el resultado de startproject:

imagen-12

Como vemos se han creado cuatro ficheros:

  • __init__.py. Fichero vacio que le indica a Python que este directorio debe ser considerado como un paquete
  • manage.py. Herramienta de linea de comandos para gestionar el proyecto Classifieds.
  • settings.py. Fichero donde se recogen las configuraciones del proyecto Classifieds.
  • urls.py. Fichero donde se declaran las URLs de las aplicaciones del proyecto Classifieds.

Ahora entramos en el directorio classifieds (si no estamos) y vamos a lanzar el servidor de desarrollo de Django:

python manage.py runserver

Comprobamos que funciona correctamente… ya hemos puesto la primera piedra de nuestro proyecto ;-)

Instalando Django + PostgreSQL en Mac OS X Leopard 10.5.7

07-jul-09

1. Instalar Python

Existen varias implementaciones distintas de Python: CPython, Jython, IronPython, PyPy, etc…

CPython es la más utilizada, la más rápida y la más madura. Cuando la gente habla de Python normalmente se refiere a esta implementación.

En este caso tanto el intérprete como los módulos están escritos en C. Jython es la implementación en Java de Python, mientras que IronPython es su contrapartida en C# (.NET). Su interés estriba en que utilizando estas implementaciones se pueden utilizar todas las librerías disponibles para los programadores de Java y .NET.

PyPy, por último, como habréis adivinado por el nombre, se trata de una implementación en Python de Python.

CPython está instalado por defecto en la mayor parte de las distribuciones Linux y en las últimas versiones de Mac OS (entre la que se encuentra Leopard). Para comprobar si está instalado abre una terminal y escribe python. Si está instalado se iniciará la consola interactiva de Python y obtendremos parecido a lo siguiente:
imagen-1

2. Instalar Django

Abrimos una sesión de terminal, creamos un directorio temporal donde alojaremos los ficheros de instalación de Django y entramos en el mismo.

mkdir django_install && cd django_install

Obtenemos la última versión estable de Django:

wget http://www.djangoproject.com/download/1.0.2/tarball/

Debemos tener en cuenta que wget no viene instalado por defecto en OS X, si quieres instalarlo aqui explican como hacerlo, si no deseas instalarlo, puedes bajar directamente el fichero de la pagina oficial.

Descomprimimos el fichero en el directorio antes creado y entramos en él:

tar zxvf Django-1.0.2-final.tar.gz && cd Django-1.0.2-final

Y lanzamos el instalador de Django:

sudo python setup.py install

Esto instalará Django en el directorio site-packages de Python.

Para comprobar que ha sido instalado correctamente, abrimos la consola interactiva de Python y escribimos:

>>> import django
>>> django.VERSION

Y debemos obtener algo como esto:
imagen-2

3. Instalar PostgreSQL

Puesto que necesitamos bases de datos para nuestras aplicaciones, tenemos que instalar un servidor de bases de datos, para ellos instalaremos PostgreSQL, que es un motor 100% libre y muy robusto. Nos dirigimos a la pagina oficial:

http://www.postgresql.org/download/macosx

Y descargamos el paquete (en el momento de escribir este post, la version era la 8.4.0). Hacemos click en el paquete y arrastramos la aplicación al menu Aplicaciones, cuando ejecutemos el fichero (probablemente tengamos que reiniciar el equipo) comenzará el proceso de instalación. Durante el proceso de instalación, le indicaremos el directorio de instalación, el directorio de datos, la contraseña para el superusuario, el puerto al que servidor debe escuchar (por defecto), la configuración regional (seleccionaremos es_ES) y listo.

4. Instalar PhppgAdmin

PhppgAdmin, es una herramienta web de administración de bases de datos PostgreSQL, es muy sencillo de instalar y utilizar, si estas acostumbrado a PhpmyAdmin, es muy similiar. Para instalarlo, tan solo tienes que dirigirte a su web oficial

http://phppgadmin.sourceforge.net/

Descargar el fichero y descomprimirlo en la carpeta root del servidor web. Podras acceder a la aplicación, desde la ruta http://localhost/phpPgAdmin/

Es posible, que tengas problemas para acceder con el usuario root (que para el caso de postgresql, es postgres), porque en estas ultimas versiones se ha deshabilitado el acceso. No obstante, y dado que vamos a trabajar en local, podemos habilitar el acceso root, tan solo modificando el fichero config.inc.php, situado en la carpeta config, localizamos la linea:

$conf['extra_login_security'] = true;

Y la sustituimos por esta:

$conf['extra_login_security'] = false;

De todos modos, insisto en que esto es peligroso y lo recomendable, es crear un usuario nuevo (desde la consola de postgresql: psql en terminal).

5. Instalamos la libreria Python PostgreSQL

Para establecer las conexiones entre la base de datos y Django necesitamos una libreria adicional denominada psycopg 2.

Para instalarla la libreria, podemos acceder a terminal y escribir:

sudo easy_install psycopg2

Si esto no funciona, tendremos que descargarnos el paquete desde aqui, modificamos la linea:

pg_config=/Library/PostgreSQL/8.4/bin/pg_config

Para indicarle la ruta donde esta PostgreSQL.
Luego compilamos e instalamos el paquete, desde terminal:

python setup.py build
python setup.py install

NOTA: Es posible que necesitemos instalar el compilador GCC, si obtenemos un mensaje de error cuando intentemos compilar el paquete, nos dirigimos a http://developer.apple.com/technology/Xcode.html y desde alli, previo registro en el ADC Membership de Apple, podremos descargar XCode, donde se incluye el compilador GCC.

6. Comprobamos que todo funciona

Creamos un proyecto en Django y arrancamos el servidor de desarrollo que incluye, para ver si funciona correctamente:

mkdir django_projects
cd ~/django_projects
django-admin.py startproject mi_proyecto
cd mi_proyecto
python manage.py runserver

Accedemos a la dirección http://127.0.0.1:8000 y si todo ha ido bien, podremos ver la pantalla de bienvenida de Django:
imagen-11

Ahora comprobaremos la conexión con la base de datos, para ello accedemos primeramente a phpPgAdmin y creamos una base de datos que se llame prueba.
Seguidamente, editamos la configuración de la base de datos en el fichero settings.py que se encuentra dentro del directorio mi_proyecto, debe quedar asi:

DATABASE_ENGINE = 'postgresql_psycopg2'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'prueba'             # Or path to database file if using sqlite3.
DATABASE_USER = 'postgres'             # Not used with sqlite3.
DATABASE_PASSWORD = 'contraseña'         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

Ahora abrimos una ventana de terminal, y nos situamos en el directorio mi_proyecto, y escribimos:

python manage.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()

Si no pasa nada, significa que la base de datos está configurada correctamente.

Django: El Framework

04-jul-09

Despues de probar por un tiempo CakePHP, dado que PHP era el lenguaje que siempre habia utilizado, y despues de leer mil y un articulos al respecto, he decidido probar Django. Supongo que será una tarea dura, ya que en principio no tengo ni idea de Python, pero poco a poco les iré contando mis experiencias de principiante con este Framework.

Pero, que es Django:

Django es un framework de desarrollo web de código abierto, escrito en Python, que cumple en cierta medida el paradigma del Modelo Vista Controlador. Fue desarrollado en origen para gestionar varias páginas orientadas a noticias de la World Company de Lawrence, Kansas, y fue liberada al público bajo una licencia BSD en julio de 2005.

Antes de adentrarme en este nuevo mundo, he localizado algunos tutoriales e información en castellano que quisiera compartir con ustedes: