Python Flask com Heroku

O Flask é um framework leve e simplificado em Python para criar aplicações Web. E o Heroku é uma plataforma em nuvem onde você pode publicar suas aplicações ou serviços com planos grátis para iniciantes e estudantes.

Esse é um tutorial para criar um projeto Python com Flask e Gunicorn do zero, fazendo deploy na plataforma em nuvem Heroku.

O Flask será usado para criar um serviço que irá atender uma requisição HTTP. O Gunicorn é um HTTP Server que subirá o serviço do Flask. O Gunicorn será usado porque o HTTP Server interno do Flask é somente para desenvolvimento e testes, não deve ser utilizado em produção.

O código completo desse exemplo pode ser clonado a partir do Git em https://github.com/edprata/python-flask-on-heroku

Preparação no Heroku:

  1. Acesse o Github e crie um repositório novo para o seu projeto.
  2. Acesse o Heroku e crie uma conta gratuita. Ele utiliza autenticação em duas etapas. Você pode usar o Google Authenticator no seu celular para esse fim.
  3. Na home do Heroku, clique no botão “New” no canto superior direito e selecione “Create new app”.
  4. Em “App name” coloque o nome do seu projeto, pode ser o mesmo do Github.
  5. Clique em “Add Pipeline”.
  6. Em “Choose a pipeline” escolha “Create new pipeline”.
  7. Em “Name the pipeline” pode usar o mesmo nome do App. Se for usar staging (um ambiente de homologação) pode acrescentar “-stage” no final do nome para diferenciar da pipeline de produção (production). É recomendado usar pelo menos dois ambientes, em sendo pré produção.
  8. Em “Choose a stage to add this app to” escolha “staging”.
  9. Clique em “Create app”.
  10. Abra a aba “Deploy” e desça até “Deploy method”.
  11. Clique em “GitHub”, informe o nome do repositório e clique no botão “Search”.
  12. Agora seu App Heroku está conectado ao repositório Github e pronto para receber seu código.

Clone e Criação do Projeto:

Em um diretório da sua máquina a sua escolha faça a clonagem do projeto Github:

git clone https://github.com/<seu_usuario>/<seu_projeto>.git

O projeto estará vazio, acesse sua IDE preferida, como o PyCharm, e crie um projeto Python nesse diretório.

Preparação do Projeto Python para o Heroku:

1. Crie um arquivo chamado “requirements.txt”, no raiz do projeto, com as dependências (bibliotecas). Esse arquivo é lido pelo Heroku durante o deploy e essas dependências serão instaladas automaticamente. O conteúdo deve ficar conforme abaixo, cada dependência em uma linha. Em nosso exemplo o conteúdo deve ser:

flask
gunicorn

2. Crie um arquivo chamado “Procfile” (desse jeito, sem extensão) com o seguinte conteúdo:

web: gunicorn service

3. Esse arquivo é lido pelo Heroku após o deploy e o comando dentro dele é executado. No nosso caso o comando acima subirá o HTTP Server Gunicorn executando um arquivo Python chamado “service”. Note que não será chamado o Flask diretamente, pois é o Gunicorn que fará esse trabalho.

Código Python com o Flask:

Para nosso Hello World escreva num arquivo chamado “service.py” o seguinte código:

# Lib do Flask.
from flask import Flask

# Lib que permite ler variáveis de ambiente.
from os import environ

# Lê a variável de ambiente HOST e na sua ausência usa o endereço '0.0.0.0'.
# Esse endereço com zeros indica ao Flask para aceitar requisições de outras origens.
# Por default o Flask só aceita requisições da máquina local.
host = environ.get("HOST", '0.0.0.0')

# Lê a variável de ambiente PORT, pois no servidor é um dado dinâmico.
port = environ.get("PORT", 5000)

# Imprime os dados para aparecer no log do Heroku.
print("HOST={} PORT={}".format(host, port))

# Cria um objeto Flask para subir no servidor.
app = Flask(__name__, static_folder='static')

# Essa variável "application" será usada pelo Gunicorn para subir o Flask.
application = app.wsgi_app

# Médoto que irá atender uma requisição HTTP tipo GET na raiz do domínio.
@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

if __name__ == '__main__':
    # Sobe o Flask no host e porta do ambiente em que está rodando.
    app.run(debug=False, host=host, port=port)

OBS: O nome do arquivo não é importante, mas deve ser o mesmo referenciado no arquivo “Procfile”.

Commit do código:

No console, faça commit no GitHub conforme abaixo:

git add *
git commit -m "Commit inicial do projeto"
git push

Conectando o Pipeline do Heroku ao Github:

  1. Retorne ao Heroku, acesse o pipeline criado por você e em seguida a aba “Settings”.
  2. Desça até “Connect to GitHub”.
  3. Informe o nome do repositório no GitHub e clique em “Search”.
  4. Clique no botão “Connect”.
  5. Acesse a página de configurações do App criado por você (na tela “Pipeline” tem o atalho).
  6. Acesse a aba “Deploy” e desça até “Automatic deploys”.
  7. Clique no botão “Enable Automatic Deploys” para que nos próximos commits o deploy ocorra automaticamente.
  8. Desça até “Manual deploy” e clique no botão “Deploy Branch”, já que essa é a primeira vez e você já fez commit.
  9. Aguarde até que o deploy termine e apareça a mensagem “Your app was successfully deployed.”.
  10. No canto superior direito no topo da tela há o botão “Open app”, clique nele e veja o resultado.

Dicas:

  • Se houver erro no deploy você pode consultar o log no Heroky. Utilize o botão “More” e em seguida “View Logs” no canto superior direito da tela.
  • Se ocorrer erro nas primeiras tentativas de deploy ou se ficar muito tempo inativo o serviço pode cair e você pode ter que ir até a página do seu App, aba “Overview”, quadro “Dyno information” e verificar se está “ON”. Se não estiver clique em “Configure dynos” e no quadro “Free Dynos” clique no lápis (lado direito). Coloque em “ON” e confirme.
  • Você pode criar um segundo pipeline de production para ter dois ambientes e trabalhar com promoção de código. Cada pipeline pode receber o código de um branch diferente do GitHub, por exemplo branch “homolog” e “master”.

Referências:

Se quiser conhecer mais sobre os assuntos abordados aqui pode consultar os endereços abaixo: