O flask é um micro framework que utiliza tecnologia wsgi para servir aplicações web utilizando Python. Os dois componentes basicos do flask são o Jinja que é um motor de templates e o Werkzeug que é um toolkit para trabalhar com WSGI.
Um micro framework tem a intenção de ser pequeno atendendo as necessidades básicas, e permitindo adicionar extensões para atender outras necessidades.
Para que cada projeto possa utilizar versões de bibliotecas diferentes é interessante utilizar ambientes virtuais no Python.
Link tutorial ambiente virtual
- Tenha o python 3.5 ou mais recente instalado em sua máquina.
- Crie uma pasta para o seu projeto no meu caso
D:\workspace\site-flask
- Abra o prompt de comando (Windows) ou bash (Linux/Git Bash)
- Entre na pasta onde estará o seu projeto
- Execute o comando o
python -m venv venv
- Será criado um ambiente virtual isolado dentro da pasta venv
- Windows
- Se estiver utilizando o prompt de comando basta executar
/venv/Script/activate.bat
para entrar nesse ambiente virtual - Se estiver usando o bash no windows rode o comando
source /venv/Script/activate
- Se estiver usando o bash no linux rode o comando
source /venv/bin/activate
- Se estiver utilizando o prompt de comando basta executar
- Para sair do ambiente use o comando
deactivate
Depois de ter o ambiente virtual configurado é possivel instalar o flask rodando o comando pip install flask
Certifique de que está com ambiente virtual ativo em seu prompt/bash
Depois de instalado o flask é possivel gerar um arquivo com as dependências instaladas rodando o comando pip freeze > requirements.txt
Um arquivo requirements.txt será criado com as dependências e suas respectivas versões.
Caso necessite instalar as dependencias em outro ambiente virtual é possível instalar a partir do comando pip install -r requirements.txt
Crie o arquivo app.py com o seguinte conteúdo.
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello World"
Após isso é possível executar a sua aplicação web com o comando flask run
.
Após isso você verá algo como
* 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)
Podemos ver que o nosso servidor está sendo executado na porta 5000, dessa forma podemos acessar nossa url pelo navegador usando o endereço:
http://127.0.0.1:5000/
ou http://localhost:5000/
e ver a mensagem "Hello World" ser retornada.
O protocolo http funciona utilizando endpoints e métodos, no exemplo anterior registramos a rota para o endpoint "/" para o método GET (No flask quando não informamos o método ele registra como GET). Ao acessarmos um endereço pelo navegador, estamos utilizando o método GET.
O método GET solicita a representação de um recurso específico. Requisições utilizando o método GET devem retornar apenas dados.
O método POST é utilizado para submeter uma entidade a um recurso específico, frequentemente causando uma mudança no estado do recurso ou efeitos colaterais no servidor.
O método PUT substitui todas as atuais representações do recurso de destino pela carga de dados da requisição.
O método DELETE remove um recurso específico.
Documentação da Mozilla sobre os métodos http
No flask para registrarmos um endpoint para um ou vários métodos http utilizamos o parâmetro methods.
# app.py
# Omitindo código anterior
@app.route('/exemplo_get', methods=['GET'])
def exemplo_get():
return "Aceitando metodo GET"
@app.route('/exemplo_post', methods=['POST'])
def exemplo_post():
return "Aceitando metodo GET"
@app.route('/exemplo_get_post', methods=['GET','POST'])
def exemplo_get_post():
return "Aceitando metodo GET e POST"
Como só podemos acessar o método GET pelo navegador é interessante baixar uma ferramenta para consumir os outros métodos http.
No flask para receber parâmetros e outros dados da requisição precisamos importar o proxy request
# app.py
from flask import Flask, request
# Omitido o código restante
Dentro do objeto request é possível receber parâmetros via query, ou seja os parâmetros passado pela url.
Ex: ao acessar a url http://localhost:5000/?nome=Neno&idade=29
Os parâmetros são passados após o ?
e são passados como <chave>=<valor>
e separados pelo &
Nesse exemplo recebemos os parâmetros
nome = "Neno"
idade = "29"
Poderíamos acessar esses parâmetros pelo request.args que é um dicionário com os parâmetros passados. É possível utilizar o metodo get para pegar esses valores.
# app.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
# É possível passar um valor padrão caso o parâmetro não seja passado
nome = request.args.get('nome', 'desconhecido')
idade = request.args.get('idade')
return f"Olá {nome}, você tem {idade} anos"
Podemos testar agora:
Acessando:
http://localhost:5000/?nome=Julia&idade=27
Recebemos:
Olá Julia, você tem 27 anos
Acessando:
http://localhost:5000/?nome=Jubileu
Recebemos:
Olá Jubileu, você tem None anos
Acessando:
http://localhost:5000/?idade=20
Recebemos:
Olá desconhecido, você tem 20 anos
Acessando:
http://localhost:5000/
Recebemos:
Olá desconhecido, você tem None anos
Para realizar requisições post precisamos utilizar formulários, vemos o primeiro exemplo do get, os inputs do formulário serão passados para os args/query a partir do atributo name do input. No post vemos que os valores não são passados pela url e para acessar os valores utilizamos o request.form.
# app.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
return f"""
<html>
<body>
<a href="/get">Formulario via GET</a>
<br />
<a href="/post">Formulario via POST</a>
</body>
</html>
"""
@app.route('/get', methods=['GET'])
def get():
return f"""
<html>
<body>
<form action="/formulario" method="GET">
<fieldset>
<legend>Form GET </legend>
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome" />
<br />
<label for="idade">Idade:</label>
<input type="text" name="idade" id="idade" />
<br />
<button type="submit">Enviar</button>
</fieldset>
</form>
<br />
<a href="/">voltar</a>
</body>
</html>
"""
@app.route('/post', methods=['GET'])
def post():
return f"""
<html>
<body>
<form action="/formulario" method="POST">
<fieldset>
<legend>Form POST </legend>
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome" />
<br />
<label for="idade">Idade:</label>
<input type="text" name="idade" id="idade" />
<br />
<button type="submit">Enviar</button>
</fieldset>
</form>
<br />
<a href="/">voltar</a>
</body>
</html>
"""
# Metodo que processa formulario recebido por GET
@app.route('/formulario', methods=['GET'])
def formulario_get():
nome = request.args.get('nome')
idade = request.args.get('idade')
return f"""
<h2>Olá {nome}, você tem {idade} anos, você fez um request com método GET</h2>
<br />
<a href="/get">voltar</a>
"""
# Metodo que processa formulario recebido por POST
@app.route('/formulario', methods=['POST'])
def formulario_post():
nome = request.form.get('nome')
idade = request.form.get('idade')
return f"""
<h2>Olá {nome}, você tem {idade} anos, você fez um request com método POST</h2>
<br />
<a href="/post">voltar</a>
"""
Uma forma de se trabalhar com html é utilizando templates, por padrão a pasta que o flask utiliza é templates, dessa forma vamos criar a pasta templates. Vamos criar os arquivos: - index.html - get.html - post.html - formulario.html
# index.html
<html>
<body>
<a href="/get">Formulario via GET</a>
<br />
<a href="/post">Formulario via POST</a>
</body>
</html>
# get.html
<html>
<body>
<form action="/formulario" method="GET">
<fieldset>
<legend>Form GET </legend>
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome" />
<br />
<label for="idade">Idade:</label>
<input type="text" name="idade" id="idade" />
<br />
<button type="submit">Enviar</button>
</fieldset>
</form>
<br />
<a href="/">voltar</a>
</body>
</html>
# post.html
<html>
<body>
<form action="/formulario" method="POST">
<fieldset>
<legend>Form POST </legend>
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome" />
<br />
<label for="idade">Idade:</label>
<input type="text" name="idade" id="idade" />
<br />
<button type="submit">Enviar</button>
</fieldset>
</form>
<br />
<a href="/">voltar</a>
</body>
</html>
# formulario.html
<h2>Olá {{ nome }}, você tem {{ idade }} anos, você fez um request com método {{ metodo }}</h2>
<br />
<a href="/">voltar</a>
Dentro do template vimos que as variaveis interpoladas são preenchidas com {{ nome_da_variavel }}.
Agora para retornar o template utilizamos o metodo render_template com ele passamos o nome do template kwargs com as variáveis de contexto que serão interpoladas;
# app.py
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
return render_template("index.html")
@app.route('/get', methods=['GET'])
def get():
return render_template("get.html")
@app.route('/post', methods=['GET'])
def post():
return render_template("post.html")
# Metodo que processa formulario recebido por GET/POST
@app.route('/formulario', methods=['GET','POST'])
def formulario():
metodo = request.method
if metodo == "POST":
dados = request.form
else:
dados = request.args
nome = dados.get('nome')
idade = dados.get('idade')
context = {
"nome": nome,
"idade": idade,
"metodo": metodo
}
return render_template("formulario.html", **context)
No formulario dependendo do metodo que vem na request.method os dados são carregados do args ou do form, depois criamos o dicionário com os dados que serão utilizados no template e passamos eles usando o kwargs para passar os parametros
Dentro dos templates existem outras formas de trabalhar com os dados, verifique a documentação. Link