Una herramienta muy útil para trabajar y aprender es el shell interactivo de Python configurado para Django que viene incluido de fabrica con este framework web y nos permite entre otras cosas: jugar con el código, inspeccionar clases, probar métodos o ejecutar scripts sobre la marcha. De por sí es muy útil, pero puede ser aún más potente.
En este articulo veremos:
- El Shell Por Defecto
- ¿En Que Se Puede Mejorar?
- Agregando Funcionalidades Al Shell De Django
- Conclusión
El Shell Por Defecto
Para ingresar al shell estándar del framework basta con posicionarse desde una terminal en la carpeta raíz del proyecto, la misma que contiene el archivo manage.py e iniciarlo con el siguiente comando:
(env)$./manage.py shell
En pantalla aparecerá algo similar a esto:
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Los tres símbolos >>> representa el prompt en donde podemos digitar nuestras instrucciones y el resultado se visualizara en una nueva línea sin ningún símbolo previo a ella.
¿En Que Se Puede Mejorar?
De por si el Shell de Django contiene lo necesario y suficiente para trabajar, pero se puede "tunear" y de este modo ser más productivos al obtener estas mejoras:
- Carga automática de los modelos y clases definidas por el desarrollador al momento de inicial el shell.
- Detección de modificación de estos y recarga automática sin necesidad de salir del shell, una función muy útil en verdad.
- Coloreado de sintaxis.
- Resaltado de errores.
- Sintaxis adicional para el shell.
- Autocompletado.
- Numeración por cada linea de comando y resultado.
- Cuando los bloques de código son extensos, numeración en cada linea individual (indentado).
Agregando Funcionalidades Al Shell De Django
Daré por hecho que ya tienes tu entorno virtual activado y un proyecto Django iniciado.
Django Extensions
La primera herramienta que instalaremos mediante pip
es django-extensions, esta es una colección de extensiones personalizadas para el framework Django.
En nuestra terminal ejecutamos:
(env)$ pip install django-extensions
Luego lo agregamos al archivo de configuración settings.py
de nuestro proyecto de la siguiente manera:
INSTALLED_APPS = (
...
'django_extensions',
)
Django Extensions agrega múltiples funcionalidades a nuestro proyecto, pero nos enfocaremos en shell plus.
(env)$ ./manage.py shell_plus
Con este comando se inicia un shell Python interactivo mejorado, importando automáticamente todos los modelos, las clases definidas por nosotros y además del módulo datetime. Por defecto al ejecutar el comando se buscara alguno de los siguientes shell en este orden: ptpython, bpython, ipython y si no se encuentra ninguno de ellos utilizara el estándar de Python.
Al ejecutar el comando anterior, si solo se cuenta con el shell de Python, en la terminal aparecerá algo como esto:
# Shell Plus Model Imports
from django.contrib.auth.models import Group, Permission, User
from django.contrib.admin.models import LogEntry
from django.contrib.sessions.models import Session
from AppTest.models import MyPersonalModel
from django.contrib.contenttypes.models import ContentType
# Shell Plus Django Imports
from django.conf import settings
from django.contrib.auth import get_user_model
from django.utils import timezone
from django.core.cache import cache
from django.urls import reverse
from django.db import transaction
from django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When, Exists, OuterRef, Subquery
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Puedes ver más info sobre las funcionalidades del Shel Plus de Django Extensions en su apartado en la documentación oficial.
PtPython
Django Extensions es muy útil pero su verdadero potencial se aprecia al usarlo en conjunto con algún shell interactivo avanzado como es PtPython, un shel Python REPL. A continuación algunas de sus características tomadas de la Descripción del Proyecto en Pypi.org
- Highlighting de sintaxis (Resaltado).
- Edición multilínea con indentado automático.(Configurable para ejecutar el código a 2, 4 Enters o Alt+Enter desde el menú).
- Autocompletado.
- Soporte de mouse.(Se activa en el menú).
- Esquemas de color para el código.
- Combinaciones de teclas tanto de Vi como de Emacs.
- Insertar múltiples comando desde el historial (con F3).
- Prompt al estilo de ipython (Se elige desde el menú).
- Mostrar números de línea cuando la entrada contiene varias líneas (Se activa desde el menú).
- Pasar bloques completos de código (Con Ctrl+flecha arriba o abajo).
- ... y muchas otras cosas.
Con la tecla F2 se ingresa al menú, con F4 al modo Vi y con F6 se activa-desactiva el modo pegar con indentado automático.
Se puede instalar a nivel de sistema o solo dentro de un virtualenv, en ambos casos es con el comando:
(env)$ pip install ptpython
Una vez instalado se iniciara automáticamente al ejecutar el comando shell plus.
Si se instala dentro de entornos virtuales puede ser algo tediosos tener que configurarlo con cada proyecto. Una solución es buscar (o crear si no existe) el config para este en la siguiente ruta.
/home/<usuario>/.ptpython/config.py
Donde<usuario>
es el nombre de usuario del sistema. Nota que .ptpython es una carpeta oculta. Puedes encontrar unconfig.py
con varios ejemplos de configuración en su repositorio de git.
IPython
De igual modo que en el caso anterior, IPython puede instalarse de forma global a nivel de sistema o dentro de un entorno virtual para un único proyecto.
(env)$ pip install ipython
La integración de ambos, IPython y PtPython, es perfecta y se pueden utilizar las funcionalidades de ambos al mismo tiempo. Aunque es posible usar IPython sin instalar PtPython claro esta perdiendo varias de sus ventajas hasta hora mencionadas. Si gustas pueden cambiar el orden de instalación de estos dos últimos y probar uno en el shell plus de Django antes de instalar el otro, y entenderás porque se incrementa la productividad con ambos.
Aunque comparten algunas características entre sí, se puede mencionar de IPython:
- Ejecutar comandos de shell nativos (como clear para limpiar la pantalla o ls para ver contenido del directorio actual).
- Documentación, puedes usar
?
al final de casi cualquier comando, método, variable, etc si deseas más información sobre él. - Funciones mágicas.
Esta ultima característica es de especial utilidad y requiere ser tratada a parte por su extensión, pero hay un par que son de gran valor en las pruebas de código al momento de ejecutar el shell plus de Django:
In [1]: %load_ext autoreload
In [2]: %autoreload 2
autoreload
es una extensión de IPython que recarga los módulos antes de ejecutar el código que el usuario ingresa, lo cual permite realizar ajustes en los Models, View, ViewSet, Serializers (estos últimos de Django REST) y probar los cambios sin salir del shell.
Además se integran multiples atajos de teclado con IPython que permiten trabajar a mayor velocidad a medida que se van aprendiendo.
Conclusión
Agregar estas funcionalidades parece una tarea tediosa, pero si te fijas bien solo son 4 pasos:
Instalar django-extensions con pip
.
Agregarlo al _settings.py_
.
Instalar PtPython con pip
.
Instalar IPython también pip
.
Las instalaciones con pip se pueden automatizar con el requirements.txt, y el settings.py
tenerlo listo con las bases genéricas para todo proyecto, así que en cuestión de minutos se puede tener un shell plus listo para ser utilizado.
Espero que este post sea de utilidad, me puedes encontrar en Twitter o GitHub por cualquier inquietud que quieras compartir. Hasta luego.
Written by @EspiFreelancer with StackEdit.