---
# System prepended metadata

title: 13 Flask
tags: [web, day2]

---

---
tags: web,day2
robots: noindex, nofollow
lang: pt-br
---

# 13 Flask

## Instalação

O Flask é a união entre 2 importantes e bastante estabelecidas bibliotecas.

- Werkzeug: Uma biblioteca que implementa o protocolo HTTP conforme vimos no Day1
- Jinja2: Um motor de templates conforme vimos no Day1

O Flask é a junção dessas 2 ferramentas utilizando boas práticas de orientação a objetos e uma ótima documentação.

Uma das coisas mais interessantes do Flask é o seu sistema de plugins que permite ser facilmente estendido para as mais diversas necessidades.

Para instalar:

**dentro de uma virtualenv**
```bash
pip install flask
```

Após instalado o pacote pode ser inspecionado com:

```bash
pip show flask   
```

Resultado:
```yaml
Name: Flask
Version: 2.1.2
Summary: A simple framework for building complex web applications.
Home-page: https://palletsprojects.com/p/flask
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD-3-Clause
Location: ./.venv/lib/python3.8/site-packages
Requires: click, importlib-metadata, itsdangerous, Jinja2, Werkzeug
```

> Como pode perceber o Flask instala junto com ele o Jinja2, o Werkzeug, o Click e outras 2 bibliotecas de utilidade.

## Iniciando

Para começar criamos uma pasta em `exemplos/day2/flask` e dentro desta pasta um arquivo `app.py`, poderiamos dar qualquer nome ao nosso programa mas existe uma convenção na comunidade Flask de nomear sempre com `app.py` o arquivo que serve como ponto de entrada para a aplicação.

Para começar bem vamos fazer primeiro o "Hello World" do Flask e então entender como funciona sua ferramenta de linha de comando.

`app.py`
```python
from flask import Flask

app = Flask("app")  # ou Flask(__name__)

@app.route("/")
def hello():
    return "<strong>Hello World</strong>"
```

Com esse conteúdo dentro do arquivo podemos agora executar:

```bash
flask run
```

> Repare que se por acaso você executar `flask run` fora da pasta onde está o arquivo `app.py` vai obter o seguinte erro `Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.`

Portanto o Flask espera que a variável de ambiente `FLASK_APP` indique o caminho para o módulo onde está a aplicação, ou que tenha um arquivo com nomes app ou wsgi.

Para resolver podemos fazer de 2 maneiras.

1. setando a variável de ambiente:

```bash
FLASK_APP=exemplos/day2/flask/app.py flask run 
```

Ou melhor, entrando diretamente na pasta

```bash
cd exemplos/day2/flask/
flask run
```

Em ambos os casos o resultado será:

```bash
 * Serving Flask app 'exemplos/day2/flask/app.py' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
```

Em primeiro lugar acesse http://127.0.0.1:5000 no seu navegador para ver se está tudo ok, você deve ver a mensagem `Hello World`

Agora vamos analisar um pouco do funcionamento do `flask` CLI, essa ferramenta que rodamos na linha de comando.

Para visualizar todos os comandos:

```bash
flask --help
...
Commands:
  routes  Show the routes for the app.
  run     Run a development server.
  shell   Run a shell in the app context.
```

Experimente cada um dos comandos:

routes - exibe todas as URLs registradas.

```bash
flask routes

Endpoint  Methods  Rule
--------  -------  -----------------------
hello     GET      /
static    GET      /static/<path:filename>
```

shell - abre um terminal interativo no contexto da aplicação

```bash
flask shell
...

App: app [production]
Instance: ./exemplos/day2/flask/instance
```

E o comando `run` executa a aplicação usando o servidor de desenvolvimento.

```bash
flask run   
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
```

Ao executar com o `run` alguns detalhes são importantes, repare que a mensagem de warning recomenda não
usar em ambiente de produção, pois como já vimos no Day1 do treinamento, para produção existem outros tipos de servidores mais robustos como o `gunicorn`.

Portanto durante o desenvolvimento precisaremos sempre rodar no modo de dev e isso pode ser feito usando uma variável de ambiente.

```bash
export FLASK_ENV=development
flask run
```

A execução agora será um pouco diferente:

```bash
FLASK_ENV=development flask run
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 844-118-716
```

Com isso estamos executando no modo de `development` que faz com que algumas features estejam ativadas, as principais: 

- Auto Reload: Quando mudamos o código o servidor reinicia automaticamente
- Debugger: Em caso de erros teremos acesso a um terminal de debugging no próprio navegador
    - **IMPORTANTE** Para acessar o debugger será necessário ter o código PIN impresso no terminal.
