Instalar y manejar Django en entornos virtuales con Pipenv

Introducción

Python incluye un gestor de paquetes llamado pip, el problema es que no se puede tener instaladas dos versiones distintas del mismo paquete y si realizamos un proyecto que necesita una versión y luego tenemos que actualizar quizá deja de funcionar.

Los entornos virtuales sirven para crear una instalación de Python aislada a la del sistema, permitiéndonos instalar versiones de los paquetes que queramos.

Hasta hace un tiempo se utilizaba una herramienta llamada virtualenv, cuyo propósito es generar esos entornos aislados. El problema de este método es que es poco práctico porque te obliga a crear los entornos uno a uno identificándolos con un nombre. Ese es un problema común con el gestor de paquetes conda, una alternativa a virtualenv que además permite elegir la versión de Python, pero que también requiere otorgar nombres a los entornos.

Pipenv viene a solucionar ese punto, pues permite crear un entorno virtual individual para cada proyecto sin tener que darle un nombre. Simplemente crea el entorno en el directorio del proyecto y permite manejarlo desde ahí cómodamente.

La limitación que tiene este método es que está ligado a las versiones de Python que tengamos instaladas. Es decir, puedes crear entornos con otras versiones de Python diferentes a la que tienes por defecto, pero las necesitas previamente descargadas en la máquina y establecer las rutas durante la creación del entorno, algo que no sucede en conda.

Utilización de Pipenv

Utilizar pipenv es muy fácil, para instalarlo haremos lo de siempre:

pip install pipenv

Luego navegamos con la terminal al directorio de nuestro proyecto y ahí creamos el entorno de la siguiente forma:

pipenv shell

Esto no sólo lo creará, también lo activará. Lo sabremos porque en la parte delantera de la terminal aparecerá el nombre del proyecto entre paréntesis y un código:

(proyecto-hJNodmU0)

Para salir de él podemos usar el comando exit:

(proyecto-hJNodmU0) exit

Y para volver a activarlo, simplemente situándonos de nuevo en la carpeta del proyecto hacemos de nuevo:

pipenv shell

Siempre que tengamos la shell activa, el intérprete python hará referencia al del entorno virtual, sin embargo no es obligatorio tener la shell activada, podemos seguir interactuando con el entorno haciendo uso de pipenv.

Por ejemplo para instalar un paquete la lógica es simple, como si usáramos pip pero con pipenv:

pipenv install <paquete>

Incluso se puede instalar un fichero requirements.txt:

pipenv install -r requirements.txt

Y para desinstalar un paquete:

pipenv uninstall <paquete>

O si queremos ver la lista de paquetes del entorno organizado por dependencias, podemos hacerlo con:

pipenv graph

Me gusta utilizar pipenv porque me ahorra tiempo y además Visual Studio Code detecta el entorno automáticamente instalado en el directorio del proyecto.

Trabajando con Django

Para utilizar Django en Pipenv simplemente deberíamos instalarlo en el entorno creado previamente en una carpeta que representará nuestro proyecto:

pipenv install django

Ahora podemos ejecutar comandos dentro del entorno utilizando pipenv run y así crear el proyecto:

pipenv run django-admin startproject <proyecto>

Para crear una app, nos situaremos en la raíz de nuestro proyecto (donde tenemos el manage.py) y lo haremos con:

pipenv run python manage.py startapp <app>

Siguiendo la misma lógica podemos realizar migraciones, crear superusuarios, etc:

pipenv run python manage.py makemigrations
pipenv run python manage.py migrate
pipenv run python manage.py createsuperuser

Algo genial es que podemos editar el fichero Pipfile y añadir en él nuestros propios scripts, por ejemplo un script para lanzar el servidor y ahorrarnos algunas palabras. Sólo tenemos que añadir un apartado [scripts] de la siguiente forma:

Pipfile

[scripts]
server = "python manage.py runserver"

Luego para llamar al script lo haremos con el run y el nombre del script:

pipenv run server

Todo esto no es más que una muestra del poder de Pipenv, si os parece interesante os dejo la web oficial y un tutorial de Real Python que está bastante bien.

 

Django 2.2
07/06/2019