Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

sábado, 1 de noviembre de 2014

Probando Django 1.7 con Python 3

Django desde la versión 1.5 es compatible con Python 3, muchos programadores han estado probando y portando sus aplicaciones de Django a esta nueva versión por las ventajas que ofrece.

¡Usa la ultima versión estable!

La última versión estable es la 3.4.2, al momento de escribir este articulo, la versión de Ubuntu 14.04 viene con la 3.4.0, es la que usare para este tutorial.

Entorno Virtual con Python 3

$ pyvenv-3.4 --without-pip py3  # py3 es el nombre del virtualenv
 Activar el entorno vitual:
$ cd py3
$ source bin/activate
(py3) $ 
Verifica que el entorno virtual esta en Python 3:
(py3) $ python --version
 Python 3.4.0
Instalar pip:
(py3) $ curl https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py | python

Django

(py3) $ pip install django
Crear un proyecto:
(py3) $  django-admin startproject demo
(py3) $  cd demo
Crear la base de datos en Django 1.7
(py3) $ python manage.py migrate

Servidor de Desarrollo

Probamos nuestro servidor de desarrollo a ver si todo va bien hasta ahora
 (py3) $ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
November 01, 2014 - 03:00:12
Django version 1.7.1, using settings 'demo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Probamos en la dirección http://127.0.0.1:8000

Creado una Aplicación

Vamos a crear una aplicación:
 (py3) $ python manage.py startapp main
Creamos el modelo de la Aplicación en main/models.py
from django.db import models

class Persona(models.Model):
    nombre = models.CharField(max_length=100)
    apellido = models.CharField(max_length=100)

    def __str__(self):
        return self.nombre
Como podrán ver se usa el método __str__ en vez de __unicode__, ya que es uno de los cambios en Python 3

Agregamos main en demo/settings.py en INSTALLED_APPS
INSTALLED_APPS = (
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'main',
)
Ahora ejecutamos:
(py3) $ python manage.py makemigrations main
Mediante la ejecución de makemigrations, le decimos a Django que se han hecho algunos cambios en el modelo (en este caso, son nuevos) y que desea que los cambios se guarden como una migración.

Ahora, ejecute migrate de nuevo para crear las tablas del modelo en la base de datos
(py3) $ python manage.py migrate

Creando el usuario Administrador

Para crear un usuario que puede iniciar sesión en el sitio de administración. Ejecute el siguiente comando:
(py3) $ python manage.py createsuperuser
Como podrás ver, hasta aquí hemos creado una aplicación básica de Django usando Python 3, te recomiendo que revises la documentación para la creación de sitios web con Django.

¡Consideraciones Importantes!

  • Chequea siempre si los paquetes que vas a utilizar desde PyPi son compatibles con Python 3
  • En un proyecto Django, compruebe en los modelos, los métodos  __str __ (). Si los tiene, es un buen indicador de que es compatible con Python 3.
  • Utilice 2to3 para escanear el código de problemas de compatibilidad.
  • Revisa el sitio donde va correr en producción tu aplicación, en el caso de Linux, la mayoría de las distribuciones ya tienen Python 3 instalado, y es accesible a los usuarios finales. En general, la eliminación de Python 2 por defecto, ha sido gradual. Sin embargo, hay algunos módulos clave que pueden requerir el uso de Python 2 en lugar de Python 3
  • Ya existen cerca de 500 paquetes de Django compatibles con Python3, eso lo puedes revisar en la pagina de Django Packages.

Aunque la mayoría del código Python está escrito para Python 2.x, Python 3 es el presente y futuro de este lenguaje de programación.

Python 2.7.8 fue lanzado en Octubre de 2014. La rama 2.x no tendrá más lanzamientos importantes, aunque la versión 2.7 en su vida útil tendrá un período prolongado de correcciones de errores y huecos de seguridad.

Python 3.x continúa siendo desarrollado activamente. El lanzamiento más reciente de Python 3.4, fue el 6 de Octubre del 2014.

Recursos útiles

Los siguientes enlaces son recursos que pueden revisar a fin de tener mas información sobre Python 3 y como portar sus aplicaciones a esta versión del lenguaje.

Para concluir aclaro que este articulo es con fines didácticos y siempre depende de usted el buscar la mejor alternativa para su aplicación web con Django. Python 2 aún tiene soporte y lo va mantener por mucho tiempo, espero que con este artículo le ayude a crear su propia estrategia de desarrollo con Django.

miércoles, 10 de octubre de 2012

Creando Aplicaciones Web con Django 1.4 (2da Parte)

En el articulo anterior hablamos de como arrancar un proyecto en Django, en esta oportunidad aprenderemos un tema importante como es la configuración del proyecto. podemos decir primeramente que no hay una manera definitiva de hacerla, ya que la flexibilidad de Django nos permite que cada quien la realice a sus gusto.

Django por ser un framework de Python, utiliza este lenguaje para guardar sus configuraciones y aprovecha la manera de trabajar del lenguaje para hacer archivos de configuración fáciles de leer, extender y utilizar dentro de nuestros proyectos. Por eso es que quizás veremos en algunos proyectos que la configuración esta en varios archivos Python. En nuestro caso solo hablaremos y trabajaremos con el archivo settings.py.

Empecemos:

Editamos nuestro archivo settings.py con nuestro editor preferido, en mi caso yo uso vim, pero también lo puedes hacerlo con gedit, geany o nano (que es un clon del antiguo Wordstar, para algunos nostálgicos).

Primeramente importamos os, este módulo provee docenas de funciones para interactuar con el sistema operativo, en nuestro caso lo usaremos para conocer la ruta de nuestro proyecto.

# -*- coding: UTF-8 -*-
# Django settings for recetas project.

import os

#Definimos la ruta del proyecto
RUTA_PROYECTO = os.path.dirname(os.path.realpath(__file__))

También le damos la codificación UTF-8 a nuestro archivo de configuración para evitar los errores de caracteres en nuestro idioma.

Django por defecto trae la opción DEBUG=True, para que mientras estemos en desarrollo, podamos ver en detalle los errores de la aplicación, en le caso que tengamos la opción de DEBUG=False, normalmente en producción, las notificaciones de error de código son enviadas vía correo electrónico a los administradores, junto con los detalles completos del error. Para poner los datos de los administradores, debemos agregar en forma de tupla, en mi caso lo dejaré así:

 ADMINS = (
     ('Francisco Quivera', 'fquivera@gmail.com'),
)

Una vez hecho esto vamos a definir con que manejador de base de datos trabajara nuestro proyecto. Quiero aclarar que aunque es posible usar Django sin una base de datos, Django incluye un mapeador objeto-relacional (ORM), en el que es posible describir la estructura de la base de datos usando Python. Esto lo veremos en mas detalle cuando veamos los modelos, aquí solo le diremos a Django con que manejador de base de datos vamos a trabajar. Django soporta de manera predeterminada la conexión con Postgresql, MySql, Sqlite3 y Oracle. En nuestro proyecto usaremos Sqlite3, por su facilidad de uso, ya que viene con Python desde la versión 2.5.

Busquemos la siguiente sección del archivo y modificamos:

DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.sqlite3', #Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(RUTA_PROYECTO,'db/recetas.db'), # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',              # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Estoy resaltando lo que vamos a agregar, en el caso de utilizar MySql o Postgres, deben instalar previamente los módulos Python para la conexión con estas bases de datos, en Ubuntu se hace con:

MySql:
 
sudo install python-mysqldb

Postgres:

sudo apt-get install python-psycopg2

Configurar la zona horaria, Django permite configurar la zona horaria del proyecto, esto lo hacemos en la siguiente sección, en mi caso agregue la que me corresponde, pueden buscar en la red cual es la que aplica para su caso:

TIME_ZONE = 'America/Caracas'

Django también permite configurar el idioma que usará de manera predeterminada para su funcionamiento, esto es muy útil ya que el administrador de Django, utilizara el idioma definido aquí, para configurar esto debemos cambiar lo siguiente:

LANGUAGE_CODE = 'es-VE'

Django requiere rutas de archivos para cargar archivos estáticos y definir donde estarán nuestras Plantillas o Templates, para hacer esto de manera dinámica, usamos las bondades que nos ofrece Python. Como ya definimos la variable RUTA_PROYECTO, que no es mas que la ruta del directorio donde se encuentra dicho archivo, a partir de éste armaremos la ruta de los archivos estáticos.

Para esto primero debemos crear las carpetas donde vamos a tener dichos archivos, como ya estamos ubicados en home/fquivera/recetas/recetas, hacemos lo siguiente:

mkdir static media plantillas db

luego nos cambiamos a static para crear otras carpetas

cd static
mkdir js img css fonts

Nos deba quedar nuestro árbol de directorio de la siguiente manera:

└── recetas
    ├── manage.py
    └── recetas
        ├── __init__.py
        ├── db
        ├── media       
        ├── plantillas
        ├── settings.py
        ├── static
        │   ├── css
        │   ├── fonts
        │   ├── img
        │   └── js
        ├── urls.py
        └── wsgi.py

¿Para que son esas carpetas que acabamos de crear?

Bien, la carpeta static la utilizamos para ubicar los archivos de estilos css, dentro de la carpeta css, los javascript que podamos utilizar dentro de la carpeta js, las imágenes de nuestro proyecto, como logos, backgrounds, entre otros en la carpeta img y por ultimo si requerimos alguna fuente de letra, la ubicamos en la carpeta fonts
Por otro lado esta la carpeta media, esta carpeta la usamos para almacenar las imágenes, videos, sonidos que utilizamos en nuestros datos, osea, multimedia asociada en nuestra base de datos.
Y por ultimo la carpeta plantillas que allí estarán nuestras plantillas html de nuestro proyecto. La carpeta db es para el archivo de base de datos Sqlite3.

Ahora nos toca decirle a Django a través del archivo settings.py donde están ubicados esos archivos, para ello volvemos a editarlo, buscamos y cambiamos lo siguiente:

Esta variable le dirá a Django donde esta ubicada la carpeta media

MEDIA_ROOT = os.path.join(RUTA_PROYECTO,'media')

La siguiente es la ubicación vía URL, nos permitirá ubicarla mediante http://miproyecto/media

MEDIA_URL = '/media/'

Igualmente la URL para los archivos estáticos

STATIC_URL = '/static/'

La ubicación de los archivos estáticos:

STATICFILES_DIRS = (
    os.path.join(RUTA_PROYECTO,'static'),
)

Por ultimo, la ubicación de mis plantillas

TEMPLATE_DIRS = (
    os.path.join(RUTA_PROYECTO,'plantillas'),
)

Los proyectos en Django trabajan con aplicaciones, algunas ya vienen configuradas de manera predeterminada. Primeramente vamos a utilizar la aplicación de administración y su documentación, estas ya vienen construidas. Para habilitar estas aplicaciones debemos buscar la sección de INSTALLED_APPS que se encuentra casi al final del archivo settings.py y quitarle la marca de comentarios a 'django.contrib.admin' y 'django.contrib.admindocs'. Nos debe quedar de la siguiente manera:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.flatpages',
    'django.contrib.admin',
    'django.contrib.admindocs',
)

Ahora salvamos nuestro archivo settings.py, regresamos a la carpeta principal y ejecutamos el siguiente comando:

python manage.py syncdb

Este comando nos crea la base de datos del proyecto, hasta ahora solo va generar las tablas necesarias por el administrador de Django.

Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):
 
Aquí nos pide si queremos crear el superusuario para el administrador, le decimos que si, y nos pide los datos del usuario que sera el administrador

Would you like to create one now? (yes/no): yes
Username (leave blank to use 'fquivera'):
E-mail address: fquivera@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Ahora para poder ver los cambios que hicimos y navegar por la interfaz administrativa de Django, aún falta modificar un archivo llamado urls.py. Este archivo esta en la misma carpeta donde esta el archivo settings.py. Modifiquemos este archivo:

vim urls.py 

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'recetas.views.home', name='home'),
    # url(r'^recetas/', include('recetas.foo.urls')),

  #Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
)

Quitemos el comentario a algunas cosas y nos queda el archivo de la siguiente manera:

from django.conf.urls import patterns, include, url
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'recetas.views.home', name='home'),
    # url(r'^recetas/', include('recetas.foo.urls')),


    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    url(r'^admin/', include(admin.site.urls)),
)

he resaltado lo que he cambiado, además se han borrado las lineas de comentario, bien ahora si probamos lo que hemos hecho hasta ahora

$ python manage.py runserver
Validating models...

0 errors found
Django version 1.4.1, using settings 'recetas.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Y probamos en nuestro navegador http://127.0.0.1:8000

veremos lo siguiente:


Upssss, que paso aquí, como ya modificamos el archivo urls.py, Django, ve cuales son las URLs validas para el proyecto y estas son /admin y /admin/doc, ya que no hemos colocado la url raíz. corregimos la url en nuestro navegador de la siguiente manera:

http://127.0.0.1:8000/admin


Ahora Django nos pide el usuario y contraseña, para ingresar al administrador, lo hacemos y tenemos la siguiente pantalla:


Hasta aquí esta segunda parte, cualquier duda, escriba en los comentarios y así lo compartimos con todos. Hasta la próxima