Cómo implementar una aplicación Django en Heroku con Git CLI

En este tutorial, veremos cómo implementar una aplicación Python Django en Heroku con la CLI de Git. También conectaremos una base de datos y agregaremos un dominio personalizado.

Introducción

Heroku es una plataforma en la nube que proporciona servicios de alojamiento. Admite varios lenguajes de programación, incluidos PHP, Node.js y Python. Es una plataforma como servicio (PaaS) que le permite administrar aplicaciones de sitios web mientras se encarga de sus servidores, redes, almacenamiento y otros componentes de la nube.

En este artículo, veremos cómo implementar una aplicación Django en Heroku, usando Git.

Puedes seguir los mismos pasos, y desplegar la aplicación de GitHub, si está alojada ahí.

Requisitos previos

A continuación se muestra una lista de cosas que deben hacerse antes de comenzar con la implementación:

  • Git
  • Cuenta Heroku y CLI
  • Aplicación Django

La Interfaz de línea de comandos (CLI) de Heroku facilita la creación y administración de sus aplicaciones Heroku directamente desde la terminal. Es una parte esencial del uso de Heroku.

Para instalar la CLI de Heroku (también conocida como Heroku Toolbelt), siga las instrucciones en la página web oficial.

Asegúrese de que su aplicación Django se esté ejecutando en ambiente virtual que debe mantener activo durante todo el proceso de implementación.

Una cuenta de Heroku

Una vez que se hayan instalado todas estas cosas, el siguiente paso es crear una cuenta gratuita de Heroku [aquí] (https://signup.heroku.com/), si aún no tiene una cuenta.

Después de escribir lo siguiente en una terminal:

1
$ heroku login

El terminal debe mostrar un mensaje como:

1
heroku: Press any key to open up the browser to login or q to exit:

Presione cualquier tecla e inicie sesión usando su navegador. El terminal mostrará entonces un mensaje del tipo:

1
Logged in as [correo electrónico protegido]

Configurar la aplicación Django para Heroku

Ahora que hemos terminado con los requisitos previos, preparemos nuestra aplicación Django para Heroku.

Perfil

Un Procfile es un archivo llamado Procfile sin ninguna extensión de archivo ubicado en la raíz de su aplicación. Enumera los tipos de procesos en una aplicación y cada tipo de proceso es una declaración de un comando que se ejecuta cuando se inicia un contenedor/dyno de ese tipo de proceso.

Antes de crear un Procfile, querrá instalar django gunicorn en el directorio de su proyecto:

1
$ pip install django gunicorn

Si bien Django se envía con su propio servidor WSGI, nuestro Procfile le indicará a Heroku que use Gunicorn para servir nuestra aplicación, que también recomienda Heroku.

Ahora, cree un Procfile en el directorio principal y agregue la siguiente línea:

1
web: gunicorn yourdjangoweb.wsgi --log-file -

Reemplace yourdjangoweb con el nombre real de su proyecto.

Tiempo de ejecución.txt {#tiempo de ejecucióntxt}

Cree un archivo de texto llamado runtime.txt en el mismo directorio que Procfile. Le dice a Heroku qué versión de Python está usando su aplicación. Si no está seguro de la versión, ingrese python --version en la terminal con su entorno virtual Django activado.

Luego agregue la versión en runtime.txt:

1
python-x.x.x

Consulte las versiones compatibles de Python en Heroku aquí.

Hosts permitidos

Esta es una medida de seguridad adicional en Django para evitar ataques de encabezado de host HTTP al permitir que el sitio se sirva solo en host/dominios que se agregan en la lista ALLOWED_HOSTS. Si Debug = True y ALLOWED_HOSTS es [], entonces solo se permite localhost por defecto. Para implementar y servir su aplicación web en Heroku, agréguela a la lista:

1
ALLOWED_HOSTS = ['herokuappname.herokuapp.com']

Alternativamente, puede permitir todas las aplicaciones de Heroku omitiendo el nombre de la aplicación de esta manera:

1
ALLOWED_HOSTS = ['.herokuapp.com']

También puede usar ['*'] para permitir todos los hosts. Puede encontrar más detalles en la documentación.

Paquetes de instalación

A continuación se muestran los paquetes adicionales que deben instalarse en nuestro entorno virtual.

Para conectar nuestra base de datos Django con Heroku, instale dj-database-url llamando a:

1
$ pip install dj-database-url

Como Heroku usa bases de datos de Postgres, también necesitamos su adaptador para Python:

1
$ pip install psycog2

Y finalmente, usaremos Ruido blanco para servir archivos estáticos en el servidor de producción. El cual podemos instalar llamando a:

1
$ pip install whitenoise

Ya hemos configurado gunicorn, agreguemos una configuración para whitenoise y dj-database-url.

Configuración de archivos estáticos {#configuración de archivos estáticos}

Primero agregue configuraciones básicas para servir archivos estáticos en cualquier proyecto de Django. Puede copiar y pegar las siguientes configuraciones en su settings.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
PROJECT_ROOT   =   os.path.join(os.path.abspath(__file__))
STATIC_ROOT  =   os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'

# Extra lookup directories for collectstatic to find static files
STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)
  • Agregue WhiteNoise a la lista MIDDLEWARE inmediatamente después de SecurityMiddleware, que debería estar en la parte superior:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware',
    
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
      ]
    
  • Agregue STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' en su settings.py.0

Configuración de la base de datos {#configuración de la base de datos}

Estamos usando dj-database-url para configurar nuestra base de datos. Agregue estas líneas en la parte inferior de su settings.py:

1
2
3
import dj_database_url 
prod_db  =  dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(prod_db)

Requisitos.txt

Heroku reconocerá una aplicación implementada como una aplicación de Python solo si tiene un archivo requirements.txt en el directorio raíz. Le dice a Heroku qué paquetes se requieren para ejecutar su aplicación.

Podemos usar pip freeze y canalizar la salida a un archivo requirements.txt para esto:

1
$ pip freeze > requirements.txt

Su requirements.txt debe incluir estos:

1
2
3
4
5
6
whitenoise==5.2.0
dj-database-url==0.5.0
Django==3.0.9
gunicorn==20.0.4
psycopg2==2.8.5
pytz==2020.1

Nota: Las versiones anteriores son utilizadas por nuestra aplicación Django y pueden diferir de la suya.

Conecte la aplicación Heroku con Git

Ahora necesitamos crear una aplicación Heroku:

1
$ heroku create herokuappname

Mostrará un mensaje "hecho" con dos URL a lo largo de estas líneas:

1
2
Creating  herokuappname... done
https://herokuappname.herokuapp.com/ | https://git.heroku.com/herokuappname.git

Esto significa que se ha creado un repositorio de Git en la nube de Heroku para su aplicación. La URL https://herokuappname.herokuapp.com/ se usará para acceder a su aplicación en cualquier lugar, pero aún debemos hacer un paso más antes de ejecutar nuestra aplicación, es decir, debemos enviar nuestro código al repositorio.

Inicializa un repositorio vacío en el directorio de tu proyecto:

1
2
$ git init
> Initialized empty Git repository in /herokuappname/.git/

Conecta tu aplicación Heroku con el repositorio git vacío:

1
2
$ heroku git:remote -a herokuappname
> set git remote heroku to https://git.heroku.com/herokuappname.git

Agregue archivos al área de ensayo:

1
$ git add .

Confirmar los cambios/archivos:

1
$ git commit -m "first commit for all files"

Finalmente, empuje el proyecto al repositorio git alojado en Heroku:

1
$ git push master heroku

Si todo va bien, verá un resultado como este:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Counting objects: 26, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (26/26), 32.13 KiB | 0 bytes/s, done.
Total 26 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
.....
.....
remote: -----> Launching...
remote:        Released v1
remote:        https://herokuappname.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/herokuappname.git
[new branch]      master -> master

recoger estático Error {#recogererror estático}

Es posible que obtenga un error relacionado con collectstatic cuando ejecuta el comando git push heroku master. Esto está relacionado con el directorio de archivos estáticos y puede omitirlo con el siguiente comando:

1
2
3
$ heroku config:set     DISABLE_COLLECTSTATIC=1  
Setting DISABLE_COLLECTSTATIC and restarting  herokuappname... done, v2  
DISABLE_COLLECSTATIC: 1

Le dirá a Heroku que no ejecute el comando collectstatic durante la implementación de la aplicación. Puedes ejecutarlo más tarde usando bower:

1
$ heroku run 'bower install --config.interactive=false;grunt prep;python manage.py collectstatic --noinput'

Puede ocurrir por muchas razones, incluidas, entre otras, las siguientes:

  • Su lista STATICFILES_DIRS está vacía en settings.py o no está configurada correctamente.
  • Su directorio ’estático’ no contiene archivos para que ‘git’ los rastree. Puede agregar cualquier archivo temporal en su directorio ’estático’ para que funcione.

Migrar la base de datos

El paso final es reflejar sus modelos en la base de datos de Heroku ejecutando migraciones:

1
$ heroku run python manage.py migrate

¡Eso es todo, su aplicación está funcionando en heroku! Puede acceder a él en [appname].herokuapp.com. La URL en nuestro caso sería http://herokuappname.herokuapp.com/.

Adición de un nombre de dominio personalizado

Todas las aplicaciones de Heroku están alojadas en .herokuapp.com, pero puede cambiarlo a su nombre de dominio si posee uno. El proceso es sencillo:

heroku application list

  • Seleccione Configuración en la barra de navegación y desplácese hacia abajo para encontrar la sección Dominio:

heroku domain settings

  • Haga clic en Agregar dominio donde podrá agregar su nombre de dominio.

Esta opción es solo para cuentas verificadas. Se le pedirá que ingrese los detalles de la tarjeta de crédito en Heroku para verificar su cuenta. Puede encontrar más detalles sobre cómo agregar dominios y subdominios en esta página.

Conclusión

En este artículo, implementamos una aplicación Django en Heroku con un nombre de dominio personalizado, usando Git.

Además de varios servicios en la nube, Heroku también ofrece uno de los mejores tiempos de funcionamiento del servidor y soporte del equipo de operación y seguridad las 24 horas del día, los 7 días de la semana.