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:
- Acesse o Github e crie um repositório novo para o seu projeto.
- 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.
- Na home do Heroku, clique no botão “New” no canto superior direito e selecione “Create new app”.
- Em “App name” coloque o nome do seu projeto, pode ser o mesmo do Github.
- Clique em “Add Pipeline”.
- Em “Choose a pipeline” escolha “Create new pipeline”.
- 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.
- Em “Choose a stage to add this app to” escolha “staging”.
- Clique em “Create app”.
- Abra a aba “Deploy” e desça até “Deploy method”.
- Clique em “GitHub”, informe o nome do repositório e clique no botão “Search”.
- 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:
- Retorne ao Heroku, acesse o pipeline criado por você e em seguida a aba “Settings”.
- Desça até “Connect to GitHub”.
- Informe o nome do repositório no GitHub e clique em “Search”.
- Clique no botão “Connect”.
- Acesse a página de configurações do App criado por você (na tela “Pipeline” tem o atalho).
- Acesse a aba “Deploy” e desça até “Automatic deploys”.
- Clique no botão “Enable Automatic Deploys” para que nos próximos commits o deploy ocorra automaticamente.
- Desça até “Manual deploy” e clique no botão “Deploy Branch”, já que essa é a primeira vez e você já fez commit.
- Aguarde até que o deploy termine e apareça a mensagem “Your app was successfully deployed.”.
- 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: