RSS

Escribiendo tu primera aplicación (app) Django, parte 1 – Traducción

Hola, quiero compartir con ustedes este intento de traducción que hice sobre el tutorial de como hacer nuestra primera aplicación con Django. Pido disculpas si hay algún error, de cualquier tipo, y de ser así, por favor avísenme. Muchas gracias, a continuación lo que pretende ser la traducción.

El tutorial es este: https://docs.djangoproject.com/en/1.5/intro/tutorial01/

DJANGO 1.5

 Escribiendo tu primera aplicación (app) Django, parte 1

Aprendamos por ejemplo.

A través de este tutorial, te llevaremos a través de la creación de una aplicación básica de encuesta.

Consistirá en dos partes:

  • Un sitio público que va a permitir a la gente ver la encuesta y votar en ella
  • Un sitio admin que te permitirá añadir, cambiar y borrar la encuesta

Asumimos que ya tenés Django instalado. Podés decir que Django está instalado y qué versión corriendo el siguiente comando:

python -c “import django; print(django.get_version())”

Si Django está instalado, deberías ver la versión de tu instalación. Si no lo está, tendrás un error diciéndote “No module named django”, “Ningún módulo llamado django”.

Este tutorial está escrito para Django 1.5 y Python 2.x. Si la versión de Django no coincide, puedes referirte al tutorial para tu versión de Django o actualizar Django a la nueva versión. Si estás usando Python 3.x, ten en cuenta que tu código puede necesitar diferir de lo que hay en este tutorial y deberías continuar usando el tutorial solo si sabes que es lo que estás haciendo con Python 3.x.

Ver How to install Django (Cómo instalar Django) para consejos en como eliminar (remover) viejas versiones de Django e instalar una nueva.

Dónde conseguir ayuda: Si estás teniendo problemas a través de este tutorial, por favor postee (deje) un mensaje en django-users o pasa por #django en irc.freenode.net para chatear con otros usuarios Django que podrán ser capaces de ayudarte.

Creando un proyecto

Si esta es tu primera vez usando Django, deberás tener cuidado de la configuración inicial. A saber, necesitarás auto-generar código que establecerán el proyecto Django – una colección de configuraciones para instancias de Django, incluyendo configuración de base de datos, opciones específicas de Django y configuraciones específicas de aplicaciones.

Desde la línea de comandos, cd hacia el directorio en dónde te gustaría almacenar tu código, luego corre el siguiente comando:

django-admin.py startproject mysite

Esto creará el directorio mysite en el directorio actual. Si no funciona, mira Problems running django-admin.py, “Problemas corriendo django-admin.py”.

Nota: Necesitarás evitar nombrar proyectos luego de usar funciones de Python o componentes Django. En particular, esto significa que deberías evitar nombres como django (que conflictuará con Django mismo) o test (que conflictuará con funciones de los paquetes de Python).
Dónde debería vivir este código?: Si tu antecedente es simple y viejo PHP (sin uso de frameworkds modernos), estarás acostumbrado a colocar código en la raíz de documentos del servidor Web (en un lugar como /var/www). Con Django, no hacés eso. No es buena idea poner cualquiera de estos códigos Python en la raíz de documentos del servidor Web, porque corre riesgo de que la gente pueda ver tu código en la Web. Eso no es bueno para la seguridad.Pon tu código en un directorio aparte del directorio raíz, como /home/mycode.

Veamos lo que creó startproject:

mysite/

manage.py

mysite/

__init__.py

settings.py

urls.py

wsgi.py

No coincide con lo que ves?: El proyecto por default cambió recientemente. Si estás viendo una disposición plana (sin el directorio mysite/), probablemente estás usando una versión de Django que no coincide con esta versión del tutorial. Vos decidirás cambiar a la versión vieja del tutorial o a la versión nueva de Django.

Estos archivos son:

  • El directorio raíz exterior mysite/ es el contenedor del proyecto. Ese nombre no le interesa a Django; lo podés renombrar como quieras.
  • manage.py es un comando que te permite interactuar con este proyecto de Django de varias formas. Podés leer todo lo relacionado a manage.py en este enlace.
  • El directorio interno mysite/ es el paquete actual de Python para tus proyectos. Su nombre es el nombre de paquete de Python que necesitarás usar para importar cualquier cosa dentro de él (ej: mysite.urls).
  • mysite/__init__.py: Es un archivo vacío que le dice a Python que este directorio debe ser considerado un paquete Python. (Lea más sobre paquetes en la documentación oficial de Python si eres nuevo en Python).
  • mysite/settings.py: Settings/configuración para este proyecto Django. Configuración de Django te dirá todo sobre como funcionan las configuraciones.
  • mysite/urls.py: Las declaraciones URL para este proyecto Django; una “tabla de contenidos” de tu sitio Django-powered (impulsado por Django). Puedes leer más sobre URLs en URL dispatcher.
  • mysite/wsgi.py: Un punto de entrada para los servidores web compatibles con WSGI de tu proyecto. Lee más sobre How to deploy with WSGI (Cómo implementar WSGI) para más detalles.

El servidor de desarrollo

Comprobemos que esto funcionaba. Cámbiate al directorio externo mysite, si es que no lo hiciste, y corre el comando python manage.py runserver. Verás la siguiente salida en la línea de comando:

Validating models…

0 errors found

August 05, 2013 – 15:50:53

Django version 1.5, using settings ‘mysite.settings’

Development server is running at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

Inicializaste el servidor de desarrollo de Django, un servidor web ligero escrito puramente en Python. Incluimos esto con Django así puedes desarrollar cosas rápidamente, sin tener que lidiar con configuraciones de server de producción – como Apache – hasta que estés listo para la producción.

Ahora es un buen momento para notar: No uses este servidor en un entorno de producción. Está destinado sólo para uso de desarrollo. (Estamos en el negocio de crear Web frameworks, no servidores Web).

Ahora que el servidor corre, visita http://127.0.0.1:8000/ con tu navegador Web. Verás la página “Welcome to Django”, en un agradable, azúl pastel claro. It worked!.

Cambiando el puerto:Por defecto, el comando runserver inicializa el servidor de desarrollo en la IP interna en el puerto 8000.Si quieres cambiar el puerto del servidor, pásalo como argumento en la línea de comando. Por ejemplo, este comando inicializa el servidor en el puerto 8080:python manage.py runserver 8080Si quieres cambiar la IP del servidor, pásalo junto con el puerto. Para así poder escucharlo en todas las IPs públicas (útil si quieres mostrar tu trabajo en otras computadoras), usa:python manage.py runserver 0.0.0.0:8080Documentos completos de servidor de desarrollo pueden ser encontrados en la referencia runserver.

Configuración de Base de Datos

Ahora, edita mysite/settings.py. Es un módulo de Python normal con las variables de nivel de módulo que representan las configuraciones de Django. Cambia los siguientes ítems de las llaves en DATABASES ‘default’ para que coincida con la configuración de conexiones de tu base de datos.

  • ENGINE – O ‘django.db.backends.postgresql_psycopg2′, ‘django.db.backends.mysql’, ‘django.db.backedns.sqlite3′ o ‘django.db.backends.oracle’. Otros backends están disponibles.
  • NAME – El nombre de tu base de datos. Si estás usando SQLite, la base de datos será un archivo en tu computadora; en ese caso, NAME debe ser la ruta completa, incluyendo el nombre de archivo, de ese archivo. Si el archivo no existe, se creará automáticamente cuando sincronices la base de datos por primera vez (ver abajo).
    Cuando especificamos la ruta, siempre usamos la barra invertida /, incluso en Windows (ej: C:/homes/user/mysite/sqlite3.db).
  • USER – El nombre de usuario de la base de datos (no es necesario en SQLite).
  • PASSWORD – El password de tu base de datos (no es necesario en SQLite).
  • HOST – El host en donde se encuentra tu base de datos. Deja esto como una cadena vacía (o posiblemente 127.0.0.1) si tu servidor de base de datos está físicamente en la misma máquina (no es necesario en SQLite). Vea HOST para más detalles.

Si eres nuevo en base de datos, te recomendamos simplemente usar SQLite configurando ENGINE con ‘django.db.backends.sqlite3‘ y en NAME el lugar donde te gustaría almacenar tu base de datos. SQLite está incluído en Python, así que no tendrás la necesidad de instalar nada que de soporte a tu base de datos.

Nota: Si estás usando PostreSQL o MySQL, asegúrate de que creaste la base de datos para éste punto. Para eso hacelo con “CREATE DATABASE database_name;” dentro del sistema interactivo de la base de datos.Si estás usando SQLite, no necesitas crear nada de antemano – el archivo de base de datos será creado automáticamente cuando sea necesario.

Mientras estás editando settings.py, configura TIME_ZONE de acuerdo a tu zona horaria. El valor por defecto es la zona horaria Central de U.S. (Chicago).

También, notese que la configuración INSTALLED_APPS está hacia el final del archivo. Este contiene los nombres de todas las aplicaciones de Django que están activadas en esta instancia de Django. Las aplicaciones pueden ser usadas en múltiples proyectos, y la puedes empaquetar y distribuir para que sean usadas por otros en sus proyectos.

Por defecto, INSTALLED_APPS contiene las siguientes aplicaciones, todos los cuales vienen con Django:

  • django.contrib.auth – Un sistema de autenticación
  • django.contrib.contenttypes – Un framework para tipos de contenido
  • django.contrib.sessions – Un framework de sesiones
  • django.contrib.sites – Un framework para administrar múltiples sitios con una instalación Django
  • django.contrib.messages – Un framework de mensajería
  • django.contrib.staticfiles – Un framework para administrar archivos estáticos

Estas aplicaciones están incluidas por defecto para una conveniencia de caso común.

Cada una de estas aplicaciones hacen uso de al menos una tabla de la base de datos, aunque, así que necesitamos crear las tablas en la base de datos antes de que podamos usarlas. Para hacer eso, ejecutamos el siguiente comando:

python manage.py syncdb

El comando syncdb mira hacia la configuración de INSTALLED_APPS y crea cualquier tabla base de datos necesaria acorde a la configuración de la base de datos en tu archivo mysite/settings.py. Verás un mensaje por cada tabla creada en la base de datos, y verás un mensaje en el prompt preguntándote si quieres crear una cuenta de superusuario para la autenticación del sistema. Adelante y hazlo.

Si estás interesado, ejecuta el cliente para tu base de datos en la línea de comando y escribe \dt (PostreSQL), SHOW TALBES; (MySQL), o .schema (SQLite) para mostrar las tablas creadas de Django.

Para los minimalistas: Como dijimos más arriba, las aplicaciones por defecto son incluidas para el caso común, pero no todos necesitan esto. Si no necesitas alguno o a todos, siéntete libre de comentarlas o borrar las líneas apropiadas de INSTALLED_APPS antes de ejecutar syncdb. El comando syncdb sólo creará tablas para las aplicaciones en INSTALLED_APPS.

Creando modelos

Ahora que tu ambiente – el “proyecto” – está configurado, estás listo para empezar a trabajar.

Cada aplicación que escribas en Django consiste en un paquete Python, en algún lugar de tu ruta Python, que sigue una cierta convención. Django viene con una utilidad que automáticamente genera el directorio con la estructura básica para una aplicación, así puedes focalizarte en escribir el código en vez de crear directorios.

Proyectos vs aplicaciones: Cuál es la diferencia entre un proyecto y una aplicación? Una aplicación es una aplicación Web que hace algo – ej: un sistema Weblog, una base de datos de registros públicos o una aplicación de encuestas. Un proyecto es una colección de configuración y aplicaciones para un sitio Web en particular. Un proyecto puede contener múltiples aplicaciones. Una aplicación puede estar en múltiples proyectos.

Tus aplicaciones pueden vivir en cualquier lugar de la ruta de Python. En este tutorial, crearemos nuestra aplicación de encuesta junto a tu archivo manage.py así puede ser importado como su propio módulo de nivel superior, en vez de submódulo de mysite.

Para crear tu aplicación, asegúrate de estar en el mismo directorio que manage.py y escribe este comando:

python manage.py startapp polls

Eso creará el directorio polls, que luce de esta manera:

polls/

__init__.py

models.py

tests.py

views.py

La estructura de este directorio albergará la aplicación poll.

El primer paso en escribir una base de datos de una aplicación Web en Django es la de definir tus modelos – esencialmente, la disposición de tu base de datos, con metadata adicional.

Filosofía: Un modelo es la simple, fuente definitiva de información acerca de tus datos. Contiene los campos esenciales y comportamientos de la información que estás almacenando. Django sigue DRY Principle. La meta es definir el modelo de dato en un lugar y automáticamente manejar las cosas desde ahí.

En nuestra simple aplicación poll, crearemos dos modelos: Poll y Choice. Poll tiene la pregunta (question) y la fecha de publicación (publication date). Choice tiene dos campos: el texto de la elección (choice) y el recuento de votos (vote tally). Cada Choice es asociada con un Poll.

Estos conceptos son representados por simple clases Python. Edite el archivo polls/models.py para que se vea de la siguiente forma:

from django.db import modelsclass Poll(models.Model):question = models.CharField(max_length=200)pub_question = models.DateTimeField(‘date published’)class Choice(models.Model):poll = models.ForeignKey(Poll)choice_text = models.CharField(max_length=200)votes = models.IntegerField(default=0)

El código es sencillo. Cada modelo es representado por una clase que es subclase de django.db.models.Model. Cada modelo tiene un número de variables de clases, cada uno representa un campo de la base de datos en el modelo.

Cada campo es representado por una instancia de la clase Field, ej: para un campo caracter CharField y DateTimeField para datetimes. Ésto le dice a Django que tipo de dato contiene cada campo.

El nombre de cada instancia Field (ej: question o pub_date) es el nombre del campo, en formato máquina-amigable. Vas a usar este valor en tu código Python, y tu base de datos lo usará como nombre de columna.

Puedes usas el primer argumento posicional opcional a un Field para designar un nombre humano-legible. Que se utiliza en un par de piezas introspectivas de Django, y se utiliza como documentación. Si este campo no es previsto, Django usará el nombre máquina-legible. En este ejemplo, definiremos un nombre humano-legible para Poll.pub_date. Para todos los otros campos en este modelo, el nombre del campo máquina-legible será suficiente como nombre humano-legible.

Algunas clases Field requieren argumentos. CharField, por ejemplo, requiere que le de max_length. Que se utiliza no sólo en el esquema de base de datos, pero en la validación, como pronto veremos.

Field puede tener varios argumentos opcionales, en este caso, hemos establecido el valor de votos 0 por defecto.

Finalmente, note la relación que se define, usando ForeignKey. Que le dice a Django que cada Choice está relacionado a un sólo Poll. Django soporta todas las bases comunes de las bases de datos: many-to-ones (muchos a uno), many-to-many (muchos a muchos) y one-to-ones (uno a uno).

Activando modelos

Esta pequeña porción de código le da a Django mucha información. Con esto, Django es capaz de:

  • Crear un esquema de base de datos (sentencia CREATE TABLE) para esta aplicación.
  • Crear una API Python de acceso de base de datos para acceder a los objetos Poll y Choice.

Pero primero necesitamos decirle a nuestro proyecto que las aplicaciones de polls están instaladas.

Filosofía: Las aplicaciones de Django son “conectables”: Puedes usar una aplicación en múltiples proyectos, y puedes distribuir aplicaciones, porque no tienen que estar vinculados a una instalación de Django.

Edita el archivo settings.py otra vez, y cambia la configuración INSTALLED_APPS para incluir la cada ‘polls‘. Para que luzca de la siguiente manera:

INSTALLED_APPS = (‘django.contrib.auth’,‘django.contrib.contenttypes’,‘django.contrib.sessions’,‘django.contrib.sites’,‘django.contrib.messages’,‘django.contrib.staticfiles’,# Uncomment the next line to enable the admin:# ‘django.contrib.admin’,# Uncomment the next line to enable admin documentation:# ‘django.contrib.admindocs’,‘polls’,)

Ahora Django sabe para incluir las aplicaciones polls. Ejecutemos otro comando:

python manage.py sql polls

Deberías ver algo similar a lo siguiente (las sentencias SQL CREATE TABLE para las aplicaciones polls):

BEGIN;CREATE TABLE “polls_poll” (id” serial NOT NULL PRIMARY KEY,question” varchar(200) NOT NULL,pub_date” timestamp with time zone NOT NULL);CREATE TABLE “polls_choice” (id” serial NOT NULL PRIMARY KEY,poll_id” integer NOT NULL REFERENCES “polls_poll” (“id”) DEFERRABLE INITIALLY DEFERRED,choice_text” varchar(200) NOT NULL,votes” integer NOT NULL);COMMIT;

Note lo siguiente:

  • La salida exacta va a variar dependiendo de la base de datos que esté usando.
  • Los nombres de las tablas son automáticamente generados combinando el nombre de la aplicación (polls) y el nombre en minúsculas del modelo poll y choice. (Puedes sobreescribir este comportamiento).
  • Llaves primaria (IDs) son añadidas automáticamente. (Puedes sobreescribir esto, también).
  • Por convención, Django añade “_id” al campo llave foránea. (Si, podés sobreescribir esto, también).
  • La relación de claves foráneas se hace explícita por funciones de REFERENCIAS.
  • Se adapta a la base de datos que está usando, para los tipos de campo específicos de base de datos como auto_increment (MySQL), serial (PostrgreSQL), o integer primary key (SQLite) son manejados automáticamente por vos. Lo mismo va para los nombres de campos con comillas – ej: usando doble comillas o comillas simples. El autor de este tutorial corre PostgreSQL, por lo que el ejemplo de salida tiene la sintaxis PostrgreSQL.
  • El comando sql no funciona en realidad no ejecuta el SQL en tu base de datos – solo imprime por pantalla para que puedas ver lo que SQL Django requiere. Si lo deseas, puedes copiar y pegar este SQL en el prompt de tu base de datos. Sin embargo, como veremos brevemente, Django provee una manera fácil de commitear el SQL a la base de datos.

Si estás interesado, también puedes correr los siguientes comandos:

  • python manage.py validate: Chequea por cualquier error en la construcción de los modelos.
  • python manage.py sqlcustom polls: Emite las sentencias SQL personalizadas (como las modificaciones en tablas o restricciones) que son definidas por la aplicación.
  • python manage.py sqlclear polls: Emite las funciones DROP TABLE necesarias para estas aplicaciones, de acuerdo a las tablas que ya existen en tu data base (si alguno).
  • python manage.py sqlindexes polls: Emite las funciones CREATE INDEX para esta aplicación.
  • python manage.py sqlall polls: Una combinación de todos los comandos SQL: sql, sqlcustom, y sqlindexes.

Viendo las salidas de esos comandos puede ayudarte a entender que pasa en realidad bajo la cubierta.

Ahora, ejecuta syncdb otra vez para crear esos modelos de tablas en tu base de datos:

python manage.py syncdb

El comando syncdb ejecuta SQL de sqlall en tu base de datos para todas las aplicaciones en INSTALLED_APPS que aún no existen en tu base de datos. Esto crea todas las tablas, datos iniciales e indexaciones para cualquier aplicaciones que hayas añadido a tu proyecto desde la última vez que ejecutaste syncdb. syncdb puede ser llamado tan seguido como quieras, y sólo creará las tablas que no existen.

Lee la documentación de django-admin.py para más información sobre lo que manage.py puede hacer.

Jugando con las API

Ahora, vamos a la shell interactiva de Python y juguemos con las aplicaciones gratuitas que Django te ofrece. Para invocar la shell de Python, usa el este comando:

python manage.py shell

Estamos usando esto en vez simplemente escribir “python”, porque manage.py configura las variables del ambiente DJANGO_SETTINGS_MODULE, que le da a Django la ruta de Python para importar a tu archivo mysite/settings.py.

Evitando manage.py: Si prefieres no usar manage.py, no hay problema. Sólo configura el ambiente DJANGO_SETTINGS_MODULE la variable mysite.settings y ejecuta python desde el mismo directorio en donde se encuentra manage.py (o asegúrate de que ese directorio se encuentra en la ruta de Python, así import mysite funciona).Para más información de todo esto, lee la documentación de adjango-admin.py.

Una vez que estés en la shell, explora la API de la base de datos:

>>> from polls.models import Poll, Choice # Import the model classes we just wrote# No polls are in the system yet>>> Poll.objects.all()[]# Create a new Poll# Support for time zones is enabled in the default settings file, so# Django expects a datetime with tzinfo for pub_date. Use timezone.now()# instead of datetime.datetime.now() and it will do the right thing.>>> from django.utils import timezone>>> p = Poll(question=”What’s new?”, pub_date=timezone.now())# Save the object into the database. You have to call save() explicitly>>> p.save()# Now it has an ID. Note that this might say “1L” instead of “1”, depending# on which database you’re using. That’s no biggie; it just means your# database backend prefers to return integers as Python long integer# objects.>>> p.id1# Access database columns via Python attributes>>> p.questionWhat’s new?”>>> p.pub_datedatetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)# Change values by changing the attributes, then calling save()>>> p.question = “What’s up?”>>> p.save()# objects.all() displays all the polls in the database>>> Poll.objects.all()[<Poll: Poll object>]

Espera un minuto. <Poll: Poll object> es, absolutamente, una representación inútil de este objeto. Arreglemos eso editando el modelo poll (en el archivo polls/models.py) y añadir el método __unicode__() tanto en Poll y en Choice:

class Poll(models.Model):# …def __unicode__(self):return self.questionclassChoice(models.Model): # …def__unicode__(self):return self.choice_text

Es importante añadir los métodos __unicode__() a tus modelos, no solo para tu propia salud mental cuando lidias con la consola interactiva, sino también porque la representación de objetos son usados en toda la administración de Django generada automáticamente.

Por qué __unicode__() y no __str__()?: Si estás familiarizado con Python, debes tener el hábito de añadir métodos __str__() a tus clases, no métodos __unicode__(). Usamos __unicode__() aquí porque los modelos Django tratan con Unicode por defecto. Toda la información almacenada en la base de datos es convertida a Unicode cuando es retornada.Los modelos Django tienen por defecto el método __str__() que llama a __unicode__() y convierte el resultado a bytestring UTF-8.Si todo esto es una algarabía para tí, sólo recuerda añadir métodos __unicode__() a tus modelos. Con un poco de suerte, las cosas deberían funcionar para tí.

Nótese que estos son modelos normal en Python. Añadamos métodos personalizados, sólo para demostración:

import datetimefrom django.utils import timezone# …class Poll(models.Model): # …def was_published_recently(self):return self.pub_date >= timezone.now() – datetime.timdelta(days=1)

Note la añadidura de import datetie y from django.utils import timezone, que referencia al módulo standard de Python y a las utilidades relacionadas a la zona horaria de Django en django.utils.timezone, respectivamente. Si no estás familiarizados con el manejo de la zona horaria en Python, puedes aprender más en time zone support docs.

Guarda estos cambios e inicia una nueva shell interactiva de Python ejecutando python manage.py shell otra vez:

>>> from polls.models import Poll, Choice# Make sure our __unicode__() addition worked>>> Poll.objects.all()[<Poll: What's up?>]# Django provides a rich database lookup API that’s entirely driven by# keyword arguments>>> Poll.objects.filter(id=1)[<Poll: What's up?>]>>> Poll.objects.filter(question__startswith=’What’)[<Poll:What's up?>]# Get the poll that was published this year>>> from django.utils import timezone>>> current_year = timezone.now().year>>> Poll.objects.get(pub_date__year=current_year)<Poll: What’s up?># Request an ID that doesn’t exist, this will raise an exception>>> Poll.objects.get(id=2)Traceback (most recent call last):DoesNotExist: Poll matching query does not exist. Lookup parameters were {‘id’: 2}# Looup by a primary key is the most common case, so Django provides a# shortcut for primary-key exact lookups# The following is identical to Poll.objects.get(id=1)>>> Poll.objects.get(pk=1)<Poll: What’s up?>]# Make sure our custom method worked>>> p = Poll.objects.get(pk=1)>>> p.was_published_recently()True# Give the Poll a couple of Choices. The create call constructs a new# Choice object, does the INSERT statement, adds the choice to the set# of available choices and returns the new Choice object. Django creates# a set to hold the “other side” of a ForeignKey relation# (e.g. a poll’s choices) which can be accessed via the API>>> p = Poll.objects.get(pk=1)# Display any choices from the related object set – none so far>>> p.choice_set.all()[]# Create three choices>>> p.choice_set.create(choice_text=’Not much’, votes=0)<Choice: Not much>>>> p.choice_set.create(choice_text=’The sky’, votes=0)<Choice: The sky>>>> c = p.choice_set.create(choice_text=’Just hacking again’, votes=0)# Choice objects have API access to their related Poll objects>>> c.poll<Poll: What’s up?># And vice versa: Poll objects get access to Choice objects>>> p.choice_set.all()[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>>> p.choice_set.count()3# The API automatically follows relationships as far as you need.# Use double underscores to separate relationships.# This works as many levels deep as you want; there’s no limit.# Find all Choices for any poll whose pub_date is in this year# (reusing the ‘current_year’ variable we created above).>>> Choice.objects.filter(poll__pub_date__year=current_year)[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]# Let’s delete one of the choices. Use delete() for that.>>> c = p.choice_set.filter(choice_text__startswith=’Just hacking’)>>> c.delete()

Para más información de modelos de relación, lea Accessing related objects. Para más información sobre como usar el doble guió bajo para realizar búsquedas de campos a través de las API, leer Field lookups. Para detalles completos sobre API de base de datos, lea Database API reference.

 

Etiquetas: , , ,

Primer programita y/o script en Python

Buenas, les comparto un pequeño programita que hice en Python.

El programita lo básicamente lo que hace es ingresar en este caso la cantidad de pastillas que estamos consumiendo, en mi caso la persona consume 1 pastilla diaria. Ingreso la cantidad de pastillas que tengo y me dice hasta cuando las toma, y en base a eso, las compro 2 o 3 días antes.

Se muy bien que hay que pulirle, y me gustaría poder hacer un programita un poco más complejo y completo pero estoy en eso.

A continuación el link al código:

Pills

Lo escribí usando mi ide favorito, Ninja-IDE.

Espero que a alguien le sirva algo de esto y pido disculpas por mi código.

 
Deja un comentario

Publicado por en 31/07/2013 en Ocio, Programación, Python

 

Etiquetas: , , ,

La forma correcta de iniciar la programación en Python

Calendario

vía La forma correcta de iniciar la programación en Python.

 

La forma correcta de iniciar la programación en Python

Esto es un (intento) de traducción de un post titulado “Proper way to start programming Python” escrito por Jeff Bisbee.

Antes de proceder a su traducción, me puse en contacto con él para preguntarle si estaba de acuerdo y así tener su consentimiento.

A continuación el post.

Luego de algunos pasos en falso caí en la forma correcta de programar en Python. Hay dos herramientas principales para instalar módulos Python: 

  1. pip
  2. setuptools‘ easy_install script

En un sistema virgen (limpio) vas a necesitar los siguientes paquetes de la distribución de tu OS. Yo repetí este proceso en mi macbook air, en mi máquina con windows bajo cgywin, y en mi máquina virtual con Ubuntu.

1. Instalar Python y python-setuptools

Vas a necesitar instalar python y python-setuptools antes de comenzar. Macs vienen con estos paquetes preinstalados, asi que puedes saltearte este paso si gustas.

python

python-setuptools

2. easy_install virtualenvwrapper

Luego necesitarás instalar virtualenvwrapper vía setuptool’s easy_install. Debería ser el único paquete que debes instalar con easy_install.

jbisbee@benny:~$ easy_install virtualenvwrapper

Searching for virtualenvwrapper

Reading http://pypi.python.org/simple/virtualenvwrapper/

Best match: virtualenvwrapper 4.0

Finished processing dependencies for virtualenvwrapper

3. Encontrar la localización de virtualenvwrapper.sh

Una vez instalado virtualenvwrapper te gustará ver la ruta en la cual fue instalado. Por favor nótese que este es un script de shell y termina con un archivo de extensión .sh.

jbisbee@benny:~$ which virtualenvwrapper.sh

/usr/bin/virtualenvwrapper.sh

4. Añadir virtualenvwrapper.sh al inicio de tu shell

# your ~/.bashrc or ~/.profile file

export WORKON_HOME=~/.virtualenvs

# virtualenvswrapper.sh may be installed in

#         /usr/local/bin on your system

source /usr/bin/virtualenvwrapper.sh

5. Recarga tu shell

jbisbee@benny:~$ source ~/.bashrc

# source .profile

6. Crear un nuevo entorno virtualenv

Ahora estás en condiciones de comenzar a crear espacios de trabajos virtuales e instalar librerías con pip. Usando django como ejemplo:

jbisbee@benny:~$ mkvirtualenv tutorial

New python executable in tutorial/bin/python2.7

Also creating executable in tutorial/bin/python

Installing setuptools………..done.

Installing pip……………done.

(tutorial)jbisbee@benny:~$

7. Instalando módulos Python con pip

Ahora a instalar módulos python con pip con tu caja de arena virtualenv:

(tutorial)jbisbee@benny:~$ pip install django

Downloading/unpacking django

      Downloading Django-1.5.1.tar.gz (8.0MB): 8.0MB downloaded

      Running setup.py egg_info for package django

Successfully installed django

Cleaning up…

(tutorial)jbisbee@benny:~$

Post original: http://jbisbee.blogspot.com.ar/2013/07/proper-way-to-start-programming-python.html

 
1 Comentario

Publicado por en 24/07/2013 en Generales

 

Etiquetas: , , , ,

fatal: Not a git repository (or any of the parent directories): .git

Este problema super tonto y sencillo de solucionar lo tuve recién, me pasó queriendo realizar una búsqueda mediante git y entonces me daba ese mensaje:

fatal: Not a git repository (or any of the parent directories): .git

El problema se debía a que no me encontraba en la carpeta correcta.

La solución:

cd kitsune

Una vez ahí dentro:

git grep ‘request\.locale’

Y problema solucionado.

El medicamento está haciendo efecto y el laburo cuesta el doble pero sale.

Saludos

 
Deja un comentario

Publicado por en 18/09/2012 en Generales

 

Etiquetas: ,

Preparando nuestro sistema: Kitsune’s Documentation!

Decidí registrarme para colaborar con la gente de Mozilla, para saber en que grupo quería colaborar me fijé en el siguiente link:

https://wiki.mozilla.org/Webdev/GetInvolved#support.mozilla.org_.28SUMO.29

De las opciones que ahí figuran me interesó el grupo de:

support.mozilla.org (SUMO)

Firefox Help is the support site for Firefox users. It helps millions of users every week through a knowledge base and support forum. It also provides collaboration and localization tools for the contributors. It uses technology like Python, Django, MySQL, Redis, Memcached, Elastic Search and more.

  • Fork us on Github: https://github.com/mozilla/kitsune
  • Who: Ricky Rosario (r1cky) & Will Kahn-Greene (willkg)
  • IRC: irc.mozilla.org/          Channel: #sumodev
  • Support on Bugzilla: https://bugzilla.mozilla.org/buglist.cgi?quicksearch=OPEN%20product%3Asupport.mozilla.org

Opté por ese grupo por el hecho de que usan Python y Django, y MySQL.

Me incentivó a formar parte de Mozilla como Contributor el hecho de que quiero empezar a poner en marcha lo que se de Python, Django, MySQL y Git y la mejor manera de hacerlo es contribuyendo y tratando de aportar a  esta comunidad que tanto me ayudó y me sigue ayudando.

Paso a contar mi experiencia preparando mi sistema para empezar a ponerme en acción.

La distro que decidí para usar es:

Linux Mint 13 Maya KDE de 32 bits: http://www.linuxmint.com/edition.php?id=115

Estas son las otras opciones dentro de Linux Mint 13 Maya: http://www.linuxmint.com/download.php

Elegí esta distro porque en los últimos años me fui inclinando por Mint y me vienen hablando también bastante bien de KDE, asi que le quise dar una oportunidad y la verdad todo marcha sobre ruedas con esta distro.

La guía para preparar el sistema es la siguiente: http://kitsune.readthedocs.org/en/latest/index.html, si bien está en inglés es entendible y sus pasos fácil de seguir. Aunque debo admitir que en ciertos momentos me bloqueé pero los hice estando en el chat, y con la ayuda y guía de los chicos, en especial de r1cky pude completar la guía de forma satisfactoria. Mi recomendación es la de seguir la guía estando en el chat, para poder consultar ante cualquier duda que tengamos.

Algo que hice antes de empezar con la guía, lo que hice fue actualizar mi Firefox de 12 que es el que trae esta distro a la 15 y cree un Bookmark: Mozilla_SUMO y ahí guardé los siguientes links:

Webdev/GetInvolved:

https://wiki.mozilla.org/Webdev/GetInvolved#support.mozilla.org_.28SUMO.29

Kitsune’s Documentation:

http://kitsune.readthedocs.org/en/latest/index.html

Hecho eso procedí con la guía.

Arranqué con PART 2: DEVELOPER’S GUIDE - INSTALLATION

Los Requerimientos del sistema son los siguientes:

  • Python 2.6 or 2.7
  • setuptools or pip
  • MySQL Server and client headers
  • Memcached Server
  • RabbitMQ
  • libxml and headers
  • libxslt and headers
  • libjpeg and headers
  • zlib and headers
  • LESS
  • Redis
  • Several Python packages. See Installing the Packages.
  • Elastic Search. Search covers installation, configuration, and running.

Python: La mayoría de las distros ya viene con Python, generalmente la versión 2.7, la mía es la versión 2.7.3.

setuptools or pip: pip es una herramienta para instalar y gestionar paquetes Python, es el reemplazo de easy_install.

Fuente: http://www.pip-installer.org/en/latest/index.html

Para instalar pip seguí los siguientes pasos.

Primero verifiqué la existencia de los siguientes paquetes en el repositorio de Mint:

sudo apt-cache search python-pip

python-pip – alternative Python package installer
python-pipeline – iterator pipelines for Python

Lo instalé: sudo apt-get install python-pip

Luego busqué:

sudo apt-cache search python-dev

libboost-python-dev – Boost.Python Library development files (default version)
python-dev – header files and a static library for Python (default)
libboost-mpi-python-dev – Python interface to the Message Passing Interface (MPI) (default version)

sudo apt-get install python-dev

python-dev: son los headers files de python sirven para que otras librerias puedan llamar y utilizar codigo de python al momento de compilar cosas python-dev es el nombre que le suelen dar quienes empaquetan cosas en distribuciones como ubuntu o debian o fedora. GRACIAS EMI, SOS UN GROSO (http://ar.linkedin.com/pub/emiliano-dalla-verde-marcozzi/13/166/349)

Busco ahora:

sudo apt-cache search build-essential

devscripts – scripts to make the life of a Debian Package maintainer easier
build-essential – Lista informativa de los paquetes build-essential
sbuild – Tool for building Debian binary packages from Debian sources

Lo instalo: sudo apt-get install build-essential

build-essential: tiene las instrucciones para instalar los paquetes esenciales para programar en C/C++ (y hacer otras cosas relacionadas con la creación de paquetes “.deb”.

Fuente: http://carlosruizortega.wordpress.com/2008/05/12/build-essential/

Una vez que los tres paquetes se encuentran instalados: python-pip, python-dev y build-essential hacemos lo siguiente:

sudo pip install –upgrade pip

Fuentehttp://www.saltycrane.com/blog/2010/02/how-install-pip-ubuntu/

MySQL: es un sistema de gestión de base de datos relacional, multihilo y multiusuario.

Necesitamos primero asegurarnos como en el paso anterior que se encuentran en nuestro repositorio, para eso realizamos las siguientes búsquedas:

sudo apt-cache search mysql-server

mysql-server – MySQL database server (metapackage depending on the latest version)
mysql-server-5.5 – MySQL database server binaries and system database setup
mysql-server-core-5.5 – MySQL database server binaries

sudo apt-get install mysql-server mysql-server-5.5 mysql-client-5.5 mysql-server-core-5.5

mysql-server: es un administrador que permite agregar, acceder y procesar los datos almacenados en una computadora.

mysql-client: sirve para lo que todos los clientes sql, para escribir consultas sql y ver/recibir los resultados. GRACIAS TOTAL A MURRAY.

Durante la instalación de MySQL nos va a pedir que ingresemos el password que va a usar nuestro usuario root.

Memcached Server: es un sistema distribuido de propósito general para caché basado en memoria, diseñado por Danga Interactive y que es muy usado en la actualidad por múltiples sitios web.

Fuente: http://es.wikipedia.org/wiki/Memcached

Para instalarlo seguí los siguientes pasos:

  1. Hice una actualización: sudo apt-get update
  2. Como en el paso anterior ya instalamos mysql-server, debemos instalar ahora: php5-mysql y php5 php5-memcache

Es una costumbre que tengo, la de revisar si se encuentran en los repositorios.

sudo apt-cache search php5-mysql

php5-mysql – MySQL module for php5

sudo apt-cache search php5-memcache

php5-memcache – memcache extension module for PHP5

Los instalamos: sudo apt-get install php5-mysql php5 php5-memcache

Después se procede a la instalación de Memcache:

sudo apt-get install memcached

Luego se instala php-pear, que es el repositorio que almacena memcache.

sudo apt-get install php-pear

Nota: La guía pide que se instale build-essential, pero este paso como es obvio lo omitimos. Por qué? Por que ya lo instalamos cuando hicimos la instalación de pip.

Por lo que pasamos al siguiente paso:

sudo pecl install memcache

pecl (PHP Extension Community Library): conceptualmente es similar a PEAR. PECL contiene extensiones C para compilar en PHP.

Fuente: http://en.wikipedia.org/wiki/PHP_Extension_Community_Library#PECL

Durante la instalación se realiza una pregunta, hay que contestar que sí: yes

Una vez que se completó esta instalación hay que hacer lo siguiente:

sudo echo “extension=memcache.so” > sudo /etc/php5/conf.d/memcache.ini

Lo que estamos haciendo es añadir memcache a memcache.ini

Fuente: https://www.digitalocean.com/community/articles/how-to-install-and-use-memcache-on-ubuntu-12-04

RabbitMQ: es un software de negociación de mensajes de código abierto, y entra dentro de la categoría de middleware de mensajería. Implementa el estándar Advanced Message Queuing Protocol (AMQP). El servidor RabbitMQ está escrito en Erlang y utiliza elframework Open Telecom Platform (OTP) para construir sus capacidades de ejecución distribuida y conmutación ante errores.

Fuente: http://es.wikipedia.org/wiki/RabbitMQ

Esta parte depende de ustedes, digo esto porqué, porque en el repositorio figura rabbitmq, pero no es la última versión, en mi caso opté por bajar la última disponible en el sitio oficial:

http://www.rabbitmq.com/download.html

Ahí vemos las distintas opciones de acuerdo a los distintos sistemas operativos y en caso de linux, de acuerdo a las distintas distros.

En mi caso descargué: rabbitmq-server_2.8.6-1_all.deb

Lo instalé de la siguiente manera: sudo dpkg -i rabbitmq-server_2.8.6-1_all.deb

Aclaración: En caso de que hagan como yo y usen la última versión disponible, recuerden que hay que cumplir con todas las dependencias, es decir instalar los paquetes erlang. Lo remarco de esta manera porque que cuando quise instalar directamente el .deb me dio problemas y lo solucioné instalando las dependencias, que lo hice mediante previo chequeo:

sudo apt-cache search erlang

El resultado fue bastante extenso, pero figura y procedí a su instalación:

sudo apt-get install erlang

Cuando terminó la instalación, volví a ejecutar el comando para instalar el .deb y lo hizo sin problema alguno.

libxml: es una biblioteca de código para analizar documentos XML. Es también la base de la biblioteca libxslt, que procesa hojas de estilo XSLT-1.0.

Fuente: http://es.wikipedia.org/wiki/Libxml

Esta instalación es muy sencilla, se encuentra en el repositorio, si la buscan:

sudo apt-cache search libxml

El resultado va a ser no muy largo pero si tal vez algo extenso, lo que hay que instalar es lo siguiente:

sudo apt-get install libxml2 libxml2-dev

libxslt

La instalación es igual a la anterior, buscamos en los repos:

sudo apt-cache search libxslt

Este resultado es un poco más corto que el anterior:

libxml-libxslt-perl – Perl interface to the GNOME libxslt library
libxslt1-dbg – XSLT 1.0 processing library – debugging symbols
libxslt1-dev – XSLT 1.0 processing library – development kit
libxslt1.1 – XSLT 1.0 processing library – runtime library
libxsltc-java – XSL Transformations (XSLT) compiler from Xalan-Java
php5-xsl – XSL module for php5
python-libxslt1 – Python bindings for libxslt1
python-libxslt1-dbg – Python bindings for libxslt1 (debug extension)
python-lxml – pythonic binding for the libxml2 and libxslt libraries
python-lxml-dbg – pythonic binding for the libxml2 and libxslt libraries (debug extension)
python3-lxml – pythonic binding for the libxml2 and libxslt libraries
python3-lxml-dbg – pythonic binding for the libxml2 and libxslt libraries (debug extension)
python-lxml-doc – vínculos «pitónicos» para las bibliotecas libxml2 y libxslt (documentación)
libidzebra-2.0-mod-alvis – IDZebra filter alvis (XSLT filter for XML)
libidzebra-2.0-mod-dom – IDZebra filter ‘dom’ (XML DOM internal document model with XSLT)
libsp-gxmlcpp-dev – S+P C++ wrapper for Gnome libxml2/libxslt
libsp-gxmlcpp1 – S+P C++ wrapper for Gnome libxml2/libxslt
libxml-filter-xslt-perl – Perl module for XSLT as a SAX Filter
libxslthl-java – XSLT syntax highlighting
swfmill – xml2swf and swf2xml processor
gambas2-gb-xml-xslt – Gambas XSLT component

Para instalarlo hay que hacer lo siguiente:

sudo apt-get install libxslt1.1 libxslt1.dev

zlib:  es una biblioteca de compresión de datos, de software libre/fuente abiertamultiplataforma desarrollada por Jean-loup Gailly y Mark Adler. Esta biblioteca provee una implementación del algoritmo DEFLATE usado en el programa de compresión gzip.

Fuente: http://es.wikipedia.org/wiki/Zlib

Si lo buscamos:

sudo apt-cache search zlib

El resultado va a ser bastante largo, pero lo único que debemos instalar es:

sudo apt-get install zlib-bin

LESS

La guía lo indica bien, antes de instalarlo debemos instalar Node.js y NPM.

Buscamos npm:

sudo apt-cache search npm

npm – package manager for Node.js

Instalación: sudo apt-get install npm

Luego:

sudo npm install less

Redis: es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes (llave, valor) pero que opcionalmente puede ser usada como una base de datos durable o persistente.

Fuente: http://es.wikipedia.org/wiki/Redis

La instalación la seguí al pie de la letra del sitio oficial. Los pasos son los siguientes:

wget http://download.redis.io/redis-stable.tar.gz

tar xvzf redis-stable.tar.gz

cd redis-stable

make

Luego del make el sitio dice que si se quiere testear si trabaja de forma correcta o no, para hacerlo el comando es el siguiente:

make test

Aclaración: Me pasó que cuando quise hacer el test, tuve un mensaje de error y era porque no estaba cumpliendo una dependencia y la solucioné de la siguiente manera:

sudo apt-get install tcl8.5

Ejecuté de nuevo el test y funcionó perfectamente.

Sugerencia: Yo personalmente lo hice, total no cuesta nada y nos aseguramos de que todo va en orden.

Luego debemos hacer las siguientes copias, para ubicarlas en el lugar correcto. Para hacerlo lo que hay que hacer es ubicarnos en la siguiente ruta:

redis-stable/src/

Cuando descargamos redis y lo descomprimimos se creó un archivo con ese nombre: redis-stable y dentro de ésta se encuentra una carpeta con el nombre src, nos ubicamos ahí y realizamos las 2 siguientes copias:

  • sudo cp redis-server /usr/local/bin/
  • sudo cp redis-cli /usr/local/bin/

Luego de haber hecho esto incializamos Redis para probar que funciona, para hacerlo permanecemos en la ruta /redis-stable/src/ y ejecutamos el redis-server

Fuente: http://redis.io/topics/quickstart

Elastic Search: es un servidor de búsqueda basado en Apache Lucene.

Fuente: http://en.wikipedia.org/wiki/ElasticSearch

Para instalarlo seguí los siguientes pasos:

sudo apt-get install openjdk-7-jre -y

tar -xf elasticsearch.tar.gz
rm elasticsearch.tar.gz
sudo mv elasticsearch-* elasticsearch
sudo mv elasticsearch /usr/local/share
Nota: Se va a hacer uso de curl, en mi caso cuando lo quise ejecutar al comando que voy a colocar ahora, me dio un error, por problema de dependencia, que lo solucioné de la siguiente forma:
sudo apt-get install curl
Una vez satisfecha esta dependencia hay que seguir con esto:
mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch
sudo service elasticsearch start
Bueno eso es todo por ahora, saludos.
 

Problema: commit your changes or stash them before you can switch branches

Otro problema. 

Dentro de /home/apokalyptica79/kitsune luego de una serie de pasos hice lo siguiente:

git checkout -t mozilla/master

Y me daba el siguiente error:

error: Your local changes to the following files would be overwritten by checkout:
        somefile.txt --> En mi caso era otro, el cual ahora no recuerdo
Please, commit your changes or stash them before you can switch branches.
Aborting

Pero el mensaje de error era el mismo, buscando, una vez más Stackoverflow, me salvó la vida, acá el link:

http://stackoverflow.com/questions/7463392/switching-a-branch-after-aborting-current-changes-in-git

Para solucionar mi problema hice lo que sugerían ahí y problema solucionado.

Saludos

 
Deja un comentario

Publicado por en 04/09/2012 en Generales

 

Etiquetas:

 
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.