Deploy de una app Web en Django con PythonAnywhere

Video thumbnail

PythonAnywhere es simplemente un servicio que también tenemos disponible para alojar proyectos de Python Web. Es así de simple. Tiene un plan gratis (creo que para solo una aplicación) y también, obviamente, un plan de pago porque de algo tienen que vivir.

Creación de la cuenta

En este caso, ya estoy autenticado. Para crearte una cuenta, no voy a insultar tu inteligencia, simplemente entras en el siguiente enlace:

https://www.pythonanywhere.com

PythonAnywhere en Google, entras en el primer enlace, login. Si no tienes cuenta, la creas, la verificas y tendrás acceso a un panel como este. Así de simple.

Proyecto a subir

El proyecto que vamos a subir sería en Python, digo, en Django Python Web. Por aquí tenemos un par de opciones:

  • Consola, que creo que es la más interesante ya que, podemos usar git con todas las ventajas que esto nos trae de luego actualizar el proyecto mediante un git pull.
  • Archivos, que consiste en crear un comprimido, subirlo y listo.

La de consola requiere hacer un git push y todo lo demás. Y como siempre uso GitHub, ya lo tengo.

Antes de subir/clonar

Independientemente de cual opción escojas, en tu settings.py asegúrate de:

DEBUG = False
ALLOWED_HOSTS = ['tu_usuario.pythonanywhere.com']

Recuerda tener listo y actualizado tu archivo de requirements.txt.

También, agrega las referencias a tus carpetas estáticas:

Abre tu settings.py y agrega (o edita) la ruta para STATIC_ROOT:

import os
# Carpeta donde se guardarán los archivos estáticos recopilados
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
# Asegúrate de tener tu carpeta STATICFILES_DIRS si tienes otros archivos estáticos
STATICFILES_DIRS = [
   os.path.join(BASE_DIR, "static"),

Repositorio en git

Voy a utilizar mi repositorio, aunque obviamente aquí sería tu proyecto. Tiene que ser público, al menos momentáneamente, para clonar. Si no quieres hacerlo público, puedes usar la opción del zip. Yo lo haré público un momento, copio el enlace y clono desde la consola de PythonAnywhere:

$ git clone https://github.com/tuusuario/<repo>.git

Creación del ambiente virtual, dependencias, migraciones y archivos estáticos

El siguiente paso es crear el ambiente virtual con el comando correspondiente, indicando la versión de Python y el nombre del entorno. Importante: debes tener listo tu requirements.txt para instalar dependencias. Si no lo tienes, lo puedes generar fácilmente con un comando.

Desde la consola en PythonAnywhere, creas un ambiente virtual

$ mkvirtualenv --python=/usr/bin/python3.10 myenv

O coloca simplemente python3

$ mkvirtualenv --python=/usr/bin/python3 myenv

Automáticamente debería estar activo, pero, si no se activa:

$ workon myenv

Una vez clonado el proyecto, instalamos con:

$ pip install -r requirements.txt

Ejecuta las migraciones y copia todos los archivos estáticos (CSS, JS, imágenes, etc.) de cada app de tu proyecto Django hacia una sola carpeta central (STATIC_ROOT) lista para que el servidor web los sirva en producción:

$ python manage.py migrate
$ python manage.py collectstatic

Luego configuramos los archivos estáticos. Creamos la carpeta, definimos su ruta en la configuración y los servimos.

Creación de la aplicación en PythonAnywhere

En el panel, creamos una nueva aplicación manual (no con el asistente de Django, porque ya tenemos el proyecto). Seleccionamos WSGI, que es la interfaz entre el servidor y nuestra aplicación Django.

Configuración de WSGI

Aquí modificamos la ruta del proyecto y del entorno virtual. Recomiendo guardar una copia del archivo original antes de modificarlo, por si algo sale mal. Lo único que hice fue colocar el nombre de mi proyecto, y con eso tomó automáticamente las configuraciones.

HTTPS y ajustes adicionales

Podemos forzar HTTPS y ajustar rutas de archivos estáticos. Estos detalles dependen de cada proyecto. Además, desde la consola Bash de PythonAnywhere puedes ejecutar todos los comandos habituales como migrate, collectstatic, etc.

También, recuerda configurar la carpeta del ambiente virtual que es solicitada desde el panel mencionado.

Finalmente, el paso mas importante, consiste en configurar el archivo de WSGI, que recordemos que este archivo

WSGI, Es un archivo que le dice al servidor WSGI (como Gunicorn, uWSGI o el de PythonAnywhere) cómo cargar tu app Django.

PythonAnywhere te genera un archivo como:

import os
import sys

# add your project directory to the sys.path
project_home = '/home/<youruser>/<yourproyect>'
if project_home not in sys.path:
    sys.path.insert(0, project_home)

# set environment variable to tell django where your settings.py is
os.environ['DJANGO_SETTINGS_MODULE'] = '<yourproyect>.settings'

# serve django via WSGI
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Antes de editarlo, se recomienda al lector que copie y pegue el contenido ORIGINAL Y SIN EDITAR, en un archivo en el proyecto -por ejemplo- en la raíz, que debería ser algo como:

PythonAnywhereoriginal.py

Esto es, por si te equivocas en algo, puedas reemplazar el contenido con el contenido original.

Luego, lo único que deberías de cambiar, es el nombre de la carpeta del proyecto clonado, que usualmente es el nombre de la carpeta clonada por git:

project_home = '/home/acy29/django-shopping'

Desde el mismo apartado de web, en la parte superior, hay un botón que dice “Reload” que recarga tu app, si todo va bien, deberías de poder acceder a tu aplicación en producción.

Con esto ya tenemos la aplicación de Django desplegada en PythonAnywhere. En mi caso, el proyecto ya está funcionando (sin datos aún, porque eso es aparte).

Conclusión

Con esto ya tenemos la aplicación de Django desplegada en PythonAnywhere. En mi caso, el proyecto ya está funcionando (sin datos aún, porque eso es aparte).

Es un proceso bastante sencillo: clonar el repositorio, crear el entorno virtual, instalar dependencias, configurar estáticos y editar el archivo WSGI.
Si quieres aprender programación correctamente, recuerda que tienes mi aplicación de academia con recursos de pago y gratuitos, además de la publicación en la descripción con todos los comandos.

Acepto recibir anuncios de interes sobre este Blog.

Mostramos como podemos hacer el deploy de un proyecto en Django en PythonAnywhere mediante Git y el bash.

| 👤 Andrés Cruz

🇺🇸 In english