Tiempo de lectura: 20 minutos.

Público objetivo: Desarrolladores de software en Python/Django.

Nivel:  Básico.

Fecha publicación: 25 de Noviembre de 2017

Escogí este tema ya que he visto varios proyectos desarrollados en Django que utilizan para la autenticación un desarrollo personalizado en lugar de utilizar algo que ya está hecho, que ha sido probado, que provee funcionalidades adicionales que mencionaré más adelante y que funciona muy bien.

Comencemos...

En general cualquier desarrollo web no informativo requiere de opciones muy básicas para sus usuarios, crear una cuenta, cambiar una contraseña o simplemente acceder son algunas de ellas.

Django maneja por defecto un login para la administración, pero es solo para usuarios superadministradores, usuarios con todos los privilegios sobre las aplicaciones registradas y con un conocimiento avanzado en el mismo proyecto o en desarrollo de software.

Django allauth es un conjunto de aplicaciones integradas para la administración de usuarios que adicionalmente incorporan autenticación con redes sociales como facebook, google +, twitter o otros servicios como slack, github o amazon (Esto lo explicare en otra entrada del blog)

Configuración inicial

Para empezar un proyecto en django es necesario tener una configuración básica en el computador, como tener instalado python (sugiero usar python3) y entornos virtuales.

Las versiones más actualizadas de Ubuntu y Debian tienen ya instalado python3, pueden checkear la versión instalada con los siguientes comandos:

python -V
python3 -V

Luego es necesario instalar PIP (Python Package Index), manejador de paquetes de python, se instala con el siguiente comando en ubuntu (para python3):

sudo apt-get install python3-pip

Después de tener instalado pip podemos instalar paquetes o librerías desarrolladas en python más fácilmente, primero vamos a instalar un entorno virtual con virtualenvwrapper.

Un entorno virtual nos permite tener por ejemplo trabajar en un proyecto con python2.7 sin importar si el Sistema Operativo tiene instalado python3.

El entorno se instala con el siguiente comando

pip install virtualenvwrapper

si no funciona correrlo con sudo al inicio

sudo pip install virtualenvwrapper

Luego copiar las siguientes lineas al final del archivo de inicio de shell (.bashrc, .profile, etc.), estos archivos estan ubicados en el home (para mi $HOME es /home/elementalab/ donde elementalab es el usuario que tengo configurado)

export WORKON_HOME=$HOME/.entornos
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

Luego recargar el archivo de shell usando el siguiente comando, en caso de que se haya usado bashrc seria

source ~/.bashrc

Para crear el entorno virtual se usa:

mkvirtualenv nombre_entorno

Para desactivar el entorno

deactivate

Para eliminar

rmvirtualenv nombre_entorno

Instalación de Django allauth

Para instalar django y django allauth se deben correr los siguientes comandos en el entorno virtual.

pip install Django==1.11.7
pip install django-allauth

Luego se debe realizar la siguiente configuración en el archivo settings.py (Parte de esta configuración la aplica django por defecto al instalarse) y la puede encontrar en la documentación oficial de django allauth o en el repositorio creado para este artículo

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # context processors ya definidos

                # configuración requerida por django allauth
                'django.template.context_processors.request',
            ],
        },
    },
]

AUTHENTICATION_BACKENDS = (
    ...
    # Necesaria para realizar el login usando username en el 
    # administrador de Django, independiente de django allauth
    'django.contrib.auth.backends.ModelBackend',

    # métodos de autenticación especifica, como por ejemplo email
    'allauth.account.auth_backends.AuthenticationBackend',
    ...
)

INSTALLED_APPS = (
    ...
    # Las siguientes apps son requeridas, generalmente vienen en 
    # las últimas versiones de django
    'django.contrib.auth',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
)


# Id del sitio (Modelo site generado automáticamente por django)
SITE_ID = 1

Para terminar la configuración se debe agregar las urls de django allauth en el archivo urls.py principal del sitio.

urlpatterns = [
    ...
    url(r'^accounts/', include('allauth.urls')),
    ...
]

Luego se debe ejecutar el siguiente comando para generar los modelos de django allauth.

python manage.py migrate

Si el debug esta activado en el archivo settings.py (DEBUG=True) se podran ver las urls y vistas que tiene django allauth configuradas:

django allauth urls

Accediendo a la url /accounts/login se puede ver un formulario de login y un menú para decidir registrarse dentro de la aplicación, adicionalmente un link para recuperar contraseña que envía un correo electrónico para recuperar la contraseña (Para esta parte se requiere una configuración de correos adicional que no está dentro del alcance de este artículo), en esta parte también aparecen las opciones para hacer login o registrarse con redes sociales u otras plataformas.

Django allauth login

Como se puede observar no hay nada de estilos generados en la plantilla ya que django allauth se enfoca en solo la funcionalidad como tal, los estilos si son aparte, adicionalmente la comunidad que soporta el desarrollo de django allauth ha traducido los textos de acuerdo al idioma configurado en los archivos de configuración del proyecto.

Configuraciones adicionales

Dentro de la documentación proporcionada por django allauth hay unas variables que podemos definir para dentro del proyecto y que sobreescribiran las que están por defecto en django allauth, estas van en el settings.py

# redirección después de hacer login
LOGIN_REDIRECT_URL = "/"
# permitir login con username, email o ambos
ACCOUNT_AUTHENTICATION_METHOD (=”username” | “email” | “username_email”)
# verificación de email al hacer registro (opcional por defecto)
ACCOUNT_EMAIL_VERIFICATION (=”optional” | “mandatory”)

Algunas otras funcionalidades como por ejemplo deshabilitar el formulario de registro que provee django allauth pueden ser alteradas definiendo la siguiente clase (en el repositorio del proyecto pueden ver mejor esta parte):

ACCOUNT_ADAPTER = ‘nombre_carpeta.nombre_archivo.AccountAdapter’

Reemplazo de plantillas en Django allauth

Las plantillas de django allauth no son bonitas, para organizar estilos en las mismas es necesario actualizarlas algunas cosas dentro de ellas como clases, esto lo hacemos reemplazando las plantillas.

Una plantilla de django puede tener el mismo nombre y estar en el mismo directorio que otra, django tomará la primera que encuentre.

En el settings.py definir un directorio de plantillas del proyecto:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ os.path.join(BASE_DIR, 'templates') ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

En el proyecto definimos la carpeta templates y dentro de esta un archivo base.html, las plantillas de django allauth extienden este archivo, con esta definición el archivo base en el proyecto se tomará primero que el definido en django allauth.

Las plantillas estan en el repositorio de django allauth en Github.

 

Para que django tome las plantillas del proyecto solo debemos replicar el mismo directorio de carpetas y archivos y actualizarlas a nuestro gusto importando librerías de estilos y adicionando clases a los tags html para mejorar la estética del proyecto como tal, así:

El proyecto con el que se hizo este articulo lo pueden abrir aquí:

Solo es necesario clonar el repositorio, instalar un entorno virtual con python 3, correr las migraciones y correr el proyecto

Autor: Jhon J Valero R  

Ingeniero de Software en Elemental Lab

Compartir Compartir Compartir