Hospedando uma aplicação Flask no Heroku

Sempre que preciso criar um projetinho para realizar algum teste ou uma prova de conceito minha stack costuma ser essa:

  1. Linguagem: Python
  2. Framework: Flask
  3. Plataforma de Hospedagem: Heroku

Essas três ferramentas facilitam muito o dia a dia e abstraem aquela complexidade de ter que subir uma máquina em provedores como AWS ou Azure, e chega a ser mais simples do que abrir um túnel para acesso externo (outra coisa que já fiz muito e quem sabe um dia mostro como fazer aqui ✌🏼)

Antes de tudo, segue o repositório de exemplo que criei: https://github.com/jjeanjacques10/example_heroku_flask

E agora vamos por a mão na massa!

Criando nosso App

Vamos iniciar criando uma aplicação bem simples para utilizarmos como base:

app = Flask(__name__)

@app.route("/", methods=["GET"])
def index():
    return "<h1>Hello World!</h1>"

Configurando o Projeto

Requirements

Localização do Requirements

É preciso especificar quais dependências serão necessárias para executar o projeto, pois serão baixadas dentro da plataforma do Heroku. Para isso adicionamos o arquivo requirements.txt na raiz do repositório.

Flask
Flask-Cors
requests # Exemplo de lib externa que pode usar

Procfile

Localização do Procfile

Um ponto mega importante é adicionar o arquivo Procfile o qual é imprescindível para o Heroku saber qual comando executar quando for subir a aplicação. No nosso caso o comando é o seguinte:

web: python app.py

Que basicamente é o mesmo que costumamos rodar local para testar. As vezes pode ser necessário adicionar uma configuração ou outra, mas via de regra apenas chamar o python e o arquivo principal vai funcionar.

Porta

Um detalhe que pode passar despercebido é a necessidade de pegar o valor da porta que o Flask irá utilizar nas variáveis de ambiente. A plataforma irá gerar uma aleatório e mapear para a 80, por isso você consegue acessar o link sem passar o ":5000". Segue exemplo de como fazer isso de forma fácil e ainda sim definir um padrão para rodar local (port 5000):

def main():
    port = int(os.environ.get("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

Realizando o Deploy

Agora que nossa aplicação está configurada criamos nosso projeto na cloud do Heroku e conectamos com o GitHub, você também pode utilizar a opção CLI, a única diferença é que ao conectar com a plataforma da Microsoft temos a opção de habilitar o deploy automático.

Conexão GitHub e Heroku

Após fazer a conexão será iniciado o processo da esteira de deploy, baixando as dependências e preparando o ambiente.

-----> Building on the Heroku-20 stack
-----> Determining which buildpack to use for this app
-----> Python app detected
-----> No Python version was specified. Using the buildpack default: python-3.10.5
       To use a different version, see: https://devcenter.heroku.com/articles/python-runtimes
-----> Installing python-3.10.5
-----> Installing pip 22.1.2, setuptools 60.10.0 and wheel 0.37.1
-----> Installing SQLite3
-----> Installing requirements with pip
       Collecting chardet
         Downloading chardet-5.0.0-py3-none-any.whl (193 kB)
       Collecting click
         Downloading click-8.1.3-py3-none-any.whl (96 kB)
       Collecting cryptography
         Downloading cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl (4.1 MB)
       Collecting distlib
         Downloading distlib-0.3.5-py2.py3-none-any.whl (466 kB)
       Collecting et-xmlfile
         Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)
       Collecting filelock
-----> Discovering process types
       Procfile declares types -> web
-----> Compressing...
       Done: 28.7M
-----> Launching...
       Released v3
       https://example-heroku-flask.herokuapp.com/ deployed to Heroku

Pronto, agora temos uma aplicação, de forma simples, hospedada em uma cloud e de fácil acesso para qualquer pessoa que deseje consumir esse App.

Link para testar: https://example-heroku-flask.herokuapp.com/


Caso tenha alguma crítica, sugestão ou dúvida fique a vontade para me enviar uma mensagem:

Linkedin: https://www.linkedin.com/in/jjean-jacques10/

Até a próxima!

Ótimo post! :D

Porém, importante observar que os planos gratuitos do Heroku infelizmente deixarão de existir a partir de 28 de novembro de 2022.

Fonte: https://blog.heroku.com/next-chapter