Hospedando uma aplicação Flask no Heroku
Tags: heroku, python, tutorial, devops
Published: 2022-07-26 19:43:00

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

1. Linguagem: [Python](https://www.python.org/)
2. Framework: [Flask](https://flask.palletsprojects.com/en/2.1.x/)
3. Plataforma de Hospedagem: [Heroku](https://www.heroku.com/)

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:

``` python
app = Flask(__name__)

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

## Configurando o Projeto

### Requirements

![Localização do Requirements](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8fnt6vmry4m1eej7cuc5.png)

É 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`](https://github.com/jjeanjacques10/example_heroku_flask/blob/master/requirements.txt) na raiz do repositório.

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

### Procfile

![Localização do Procfile](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pu2fgrcusvbpaf62kseq.png)

Um ponto mega importante é adicionar o arquivo [`Procfile`](https://github.com/jjeanjacques10/example_heroku_flask/blob/master/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:

``` bash
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):

``` python
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7csglq076hwgoa1ix46o.png)
 
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!