En esta ocasión aprenderemos a desplegar nuestra aplicación Flask a los servidores de Heroku. Contrarío a lo que muchos puedan pensar esta es una tarea relativamente sencilla. 😉
Para este tutorial estaré trabajando con el API que construimos en el post aterior.
Bien, una vez dicho esto comencemos. 😺
Dependencias
Lo primero que debemos hacer será instalar la biblioteca de gunicor. Para ello ejecutamos el siguiente comando.
pip install gunicorn
Para trabajar con variables de entorno recomiendo utilizar decouple.
pip install python-decouple
Listo, una vez con las dependencias instaladas el siguiente paso será generar nuestro archivo requirements.txt
pip freeze > requirements.txt
Configuración Heroku
Ahora vamos a crear y configurar nuestro proyecto en Heroku; para ello haremos uso del CLI.
heroku login
Creamos nuestro proyecto.
heroku create <nombre de tu aplicación heroku>
Ligamos el repositorio a nuestra app en heroku.
heroku git:remote -a <nombre de tu aplicación heroku>
Procedemos a crear nuestra base de datos.
heroku addons:create heroku-postgresql:hobby-dev
Al nosotros crear la base de datos se creará, de forma automática, la variable de entorno DATABASE_URL, variable que almacena la url de la base de datos. 🍔
Configuración Flask
Ya tenemos el proyecto y la base de datos, toca el turno de configurar nuestro proyecto Flask. En mi caso el archivo config.py quedaría de la siguiente manera.
from decouple import config
class Config:
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'postgresql://localhost/users'
SQLALCHEMY_TRACK_MODIFICATIONS = False
class ProductionConfig(Config):
DEBUG = False
SQLALCHEMY_DATABASE_URI = config('DATABASE_URL', default='localhost')
SQLALCHEMY_TRACK_MODIFICATIONS = False
config = {
'development': DevelopmentConfig,
'production': ProductionConfig
}
Utilizo la variable de entorno DATABASE_URL para el atributo SQLALCHEMY_DATABASE_URI
En mi archivo main.py agrego una simple condición para saber cual será la configuración a utilizar.
from decouple import config as config_decouple
def create_app(enviroment):
app = Flask(__name__)
app.config.from_object(enviroment)
with app.app_context():
db.init_app(app)
db.create_all()
return app
enviroment = config['development']
if config_decouple('PRODUCTION', default=False):
enviroment = config['production']
app = create_app(enviroment)
En este caso me apoyo de la variable de entorno PRODUCTION para conocer si nos encontramos en producción o no, así que es necesario crear dicha variable en nuestro servidor.
Nos situamos en settings del proyecto en Heroku y agregamos la variable de entorno. 🤠
El siguiente paso será crear nuestro archivo Procfile, Sí, así sin extensión alguna. Colocamos lo siguiente.
web: gunicorn main:app
En mi caso colo main:app ya que la aplicación de Flask (app) se encuentra en mi archivo main.py.
En teoría, con todo lo realizado hasta este punto deberíamos poder desplegar nuestra aplicación sin ningún problema, en teoría. 🤖
Que nervios, 👻 ahora ejecutamos el siguiente comando, el comando clave.
git push heroku master
El proceso de deploy puede tardar un par de segundos, e inclusive minutos, dependiendo del tamaño del proyecto así como de las dependencias.
Listo! sí no tuviste ningún error, felicitaciones, tu proyecto ya se encuentra en un servidor de producción, todo el mundo puede acceder a él. 🤩😎
Ahora simplemente ingresamos a nuestro sitio web.
heroku open
Si queremos echa un vistazo a los logs ejecutamos la siguiente sentencia.
heroku logs