<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FrFernandez</title>
    <description>The latest articles on DEV Community by FrFernandez (@frfernandezdev).</description>
    <link>https://dev.to/frfernandezdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F773618%2Faf4e5a2c-6850-450c-92af-8cee60af76f5.jpeg</url>
      <title>DEV Community: FrFernandez</title>
      <link>https://dev.to/frfernandezdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frfernandezdev"/>
    <language>en</language>
    <item>
      <title>Desarrollo y deploy de un proyecto en Django con PostgreSQL en Heroku</title>
      <dc:creator>FrFernandez</dc:creator>
      <pubDate>Mon, 13 Dec 2021 10:30:07 +0000</pubDate>
      <link>https://dev.to/frfernandezdev/desarrollo-y-deploy-de-un-proyecto-en-django-con-postgresql-en-heroku-5961</link>
      <guid>https://dev.to/frfernandezdev/desarrollo-y-deploy-de-un-proyecto-en-django-con-postgresql-en-heroku-5961</guid>
      <description>&lt;p&gt;Realizar este simple tareas a veces se vuelven algo complejas y confusas, ya que la tecnología es un medio constantemente, en cambio, por lo cual hay que lidiar con varias versiones de estas herramientas. Pero aquí presento un pequeño guía de como lidiar con ello.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;...&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Preparar entorno de trabajo
&lt;/h2&gt;

&lt;p&gt;Para empezar debemos prepara nuestro entorno de trabajo. Para lo cual vamos a tipear los siguientes comando en la terminal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Estoy usando una terminal de Ubuntu con WSL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instalamos python y su gestor de paquetes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install python3 python3-pip&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Luego instalamos la línea de comandos de &lt;a href="https://devcenter.heroku.com/articles/heroku-cli#ubuntu-debian-apt-get"&gt;Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl https://cli-assets.heroku.com/install.sh | sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por último y no menos importante, vamos a instalar la línea de comando de Django para tareas Administrativas.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python3 pip3 install django-admin&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si en la instalación de este último, no se encuentra el comando django-admin, se es necesario agregar la ruta del script al $PATH de la terminal.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="/home/[user]/.local/bin:$PATH"
# Cambiar la variable '[user]' por el nombre correspondiente de su nombre de usuario de la pc.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, ya hemos instalado todas dependencias necesarias en nuestro entorno de trabajo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;...&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Instalar y configurar PostgreSQL.
&lt;/h2&gt;

&lt;p&gt;Instalamos PostgreSQL y dependencias para trabajar con django.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install postgresql python-dev libpq-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Configuramos la contraseña del usuario postgres y cambiar a dicho usuario.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;passwd postgres
# Ingresa la contraseña cuando te lo pida.
su postgres 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crear Base de datos y Usuario
&lt;/h3&gt;

&lt;p&gt;Creamos la base de datos y su usuario correspondiente, ademas de establecer su contraseña.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createdb [django]
createuser [django]
psql
ALTER USER [django] WITH PASSWORD '[anytoken]';
# Cambiar las variable '[django]' y '[anytoken]' por cualquier valor correspondiente.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;center&gt;...&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Crear nuestro proyecto con Django
&lt;/h2&gt;

&lt;p&gt;Ahora vamos a crear nuestro proyecto con django-admin, con el siguiente comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;django-admin startproject [django_postgres]
cd [django_postgres]
# Cambiar la variable '[django_postgres]' por el nombre real de tu proyecto.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;el cual nos va a generar los archivos base de un proyecto a desarrollar con &lt;a href="https://django-project-skeleton.readthedocs.io/en/latest/structure.html"&gt;django&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;django_postgres
  |-- django_postgres
  |  |-- __init__.py  
  |  |-- asgi.py
  |  |-- settings.py
  |  |-- urls.py  
  |  |-- wsgi.py
  |-- manage.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Iniciar el entorno virtual
&lt;/h3&gt;

&lt;p&gt;Para tener un entorno controlado y no tener problemas con dependencias externas, creamos un entorno virtual con python usando el siguiente comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m venv venv
source venv/bin/activate# En caso de querer desactivar el entorno virtual, se es necesario usar el siguiente comando.
(venv) deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalar dependencias del proyecto
&lt;/h3&gt;

&lt;p&gt;Django, es la librería central de la app y su dependencia principal.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) pip3 install Django&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Psycopg2, no permite conectarnos a cualquier motor de base de datos, y por lo tanto debemos instalarlo para poder conectarnos con nuestra base de datos con PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) pip3 install psycopg2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gunicorn.org/"&gt;Gunicorn&lt;/a&gt;, es un servidor WSGI, el cual trabaja junto con Heroku. Necesario para el deploy.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) pip3 install gunicorn&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/heroku/django-heroku"&gt;Django-heroku&lt;/a&gt;, es una librería de Heroku, que configura todas la variable globales de la app.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) pip3 install django-heroku&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración del proyecto
&lt;/h3&gt;

&lt;p&gt;Conectar nuestro proyecto con la base de datos de forma local, debemos establecer las credenciales, que se gestiono anteriormente en el archivo &lt;code&gt;django_postgres/settings.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# django_postgress/settings.py
...
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '[django]',
        'USER': '[django]',
        'PASSWORD': '[anytoken]',
        'HOST': 'localhost',
        'PORT': '5432'
    }
}
...
# Cambiar las variable '[django]' y '[anytoken]' por cualquier valor correspondiente.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Correr el proyecto
&lt;/h3&gt;

&lt;p&gt;Comprobamos el correcto funcionamiento del proyecto hasta ahora.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) python3 manage.py runserver&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lo que nos dará como resultado al visitar la siguiente &lt;a href="http://localhost:8000/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dz6dFb_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nw6y64gw2tlp0wgjuyff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dz6dFb_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nw6y64gw2tlp0wgjuyff.png" alt="Launch project" width="700" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Django nos ofrece una administración por defecto, la cual para acceder a ellas, tendremos que crear un usuario.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(venv) python3 manage.py createsuperuser

# Ingrese los datos que le pida el programa.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya realizado la operación anterior con éxito, nos dirigiremos al siguiente &lt;a href="http://127.0.0.1:8000/admin"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cBGRJaID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b03l9uf7wpn36a6457bb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cBGRJaID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b03l9uf7wpn36a6457bb.png" alt="Administration" width="700" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ingresamos nuestras credenciales.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OMBimm-s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bwvzu2yyovaxnlg3cj9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OMBimm-s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bwvzu2yyovaxnlg3cj9q.png" alt="Login admin" width="700" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;y vualá, ya tenemos nuestra administración funcionando.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;...&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy en Heroku
&lt;/h2&gt;

&lt;p&gt;Llegamos a la mejor parte, donde nuestro trabajo sera accesible al publico. Para ello necesitamos modificar el proyecto para producción, y crear los archivos necesario para hacer el deploy en Heroku.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración proyecto para producción
&lt;/h3&gt;

&lt;p&gt;Lo primero que debemos hacer es volcar todas las dependencias de librerías que usa nuestro proyecto en un archivo requirements.txt, con la ayuda del manejador de paquetes Python pip.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) pip3 freeze &amp;gt; requirements.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cual es el motivo para hacer esto, bueno muy sencillo, heroku necesita instalar las dependencias poder correr el proyecto en un dyno (así se denomina los contenedores en heroku).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: En algunas ocasiones, se puede presentar un error con la librería pkg-resource, por lo que en tal caso se debe eliminar del requirements.txt&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# requirements.txt
...
 dj-database-url==0.5.0
 Django==3.0.4
 django-heroku==0.3.1
 gunicorn==20.0.4
 --pkg-resources==0.0.0
 psycopg2==2.8.4
 pytz==2019.3
 sqlparse==0.3.1
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, vamos a modificar nuestro archivo django_postgres/settings.py, y así prepara nuestro proyecto para producción, cambiando algunas variables globales.&lt;/p&gt;

&lt;p&gt;El primer cambio va hacer agregar la librería django_heroku, para que se encargue de gestionar las variables globales.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# django_postgress/settings.py
...

import os
+++ import django_heroku

...# Al final del archivo.
...STATIC_URL = '/static/'+++ django_heroku.settings(locals())
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El siguiente cambio va hacer, cambiar el comportamiento del proyecto a producción, para ellos necesitamos cambiar la variable global DEBUG = False.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# django_postgress/settings.py
...
# SECURITY WARNING: don't run with debug turned on in production!
+++ DEBUG = False
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otro archivo que tenemos que modificar es el archivo de rutas &lt;code&gt;django_postgres/urls.py&lt;/code&gt;, al cual por conceptos de no extender tanto esta guía, vamos a usar como pages de inicio o index la misma que trae por defecto django en desarrollo. Ya que django en producción oculta dicha vista.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# django_postgress/urls.py
...from django.contrib import admin
from django.urls import path
+++ from django.views import debug

urlpatterns = [
    path('admin/', admin.site.urls),
    +++ path('',  debug.default_urlconf)
]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preparativos para el deploy en Heroku
&lt;/h3&gt;

&lt;p&gt;En este antepenúltimo paso, vamos a crear los archivos necesario para hacer el deploy, para ello vamos crear dos archivos más Procfile y runtime.txt.&lt;/p&gt;

&lt;p&gt;Procfile, contiene los comando necesario para ejecutar el proyecto y herramientas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Procfile
...web: gunicorn django_postgres.wsgi --log-file -
release: python3 manage.py migrate...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El primer comando web, ejecuta el proyecto. El segundo release ejecuta la migración hacia la base de datos de PostgreSQL en Heroku.&lt;/p&gt;

&lt;p&gt;runtime.txt, le especifica a Heroku que versión de Python debe ejecutar el código Python para mantener su integridad.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# runtime.txt
...python-3.6.9
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy en Heroku
&lt;/h3&gt;

&lt;p&gt;Por ultimo, llegamos al deploy en Heroku. Para ello necesitamos tener creado una cuenta en Heroku.&lt;/p&gt;

&lt;p&gt;Ya teniendo creada una cuenta en Heroku, procedemos a crear un app en Heroku, lo podremos hacer por medio del panel de control de la interfaz de Heroku, o por medio de su linea de comando.&lt;/p&gt;

&lt;p&gt;Para lo cual vamos a iniciar sesión en la linea de comando de Heroku, de la siguientes manera.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) heroku login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Luego vamos a crear nuestra app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(venv) heroku create --app [django_postgres]
# Cambiar las variable '[django_postgres] por el nombre de tu proyecto.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heroku usa Git para administra las implementaciones de aplicaciones, para lo cual necesitamos inicializar un repositorio local con Git.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) git init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora debemos agregar un archivo .gitignore para ignorar los archivos de cache que genera python de forma automática y las dependencias venv.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) echo 'venv/\n.py[cod]\n' &amp;gt; .gitignore&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Creamos nuestro primer commit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(venv) git add .
(venv) git commit -m 'Primer commit'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agregar el repositorio remoto a Git para hacer el push a Heroku.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(venv) heroku git:remote --app [django_postgres]
# Cambiar las variable '[django_postgres] por el nombre de tu proyecto.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora realizamos el push a Heroku.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) git push heroku master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este sera el resultado, el deploy del proyecto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NexUY13l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/av691yotw9p3ibso95kt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NexUY13l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/av691yotw9p3ibso95kt.png" alt="Terminal output" width="700" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para abrir el proyecto al navegador desde la terminal, solo debemos ejecutar el siguiente comando.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(venv) heroku open&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dz6dFb_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nw6y64gw2tlp0wgjuyff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dz6dFb_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nw6y64gw2tlp0wgjuyff.png" alt="Launch project" width="700" height="381"&gt;&lt;/a&gt;&lt;br&gt;
Y vualá, tenemos nuestro proyecto en producción.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>flask</category>
      <category>python</category>
      <category>heroku</category>
    </item>
  </channel>
</rss>
