---
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.