Skip to content

Instantly share code, notes, and snippets.

@nenodias
Last active May 6, 2022 02:20
Show Gist options
  • Save nenodias/2722e1eb9e76cc5990a0cf1799395497 to your computer and use it in GitHub Desktop.
Save nenodias/2722e1eb9e76cc5990a0cf1799395497 to your computer and use it in GitHub Desktop.
Ebook monitoria sobre flask (usar o https://md2pdf.netlify.app/ para gerar ebook)

Flask

flask icon.

O que é o Flask

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.

O que seria ser um micro framework?

Um micro framework tem a intenção de ser pequeno atendendo as necessidades básicas, e permitindo adicionar extensões para atender outras necessidades.

Configurando o ambiente virtual

Para que cada projeto possa utilizar versões de bibliotecas diferentes é interessante utilizar ambientes virtuais no Python.

Link tutorial ambiente virtual

  1. Tenha o python 3.5 ou mais recente instalado em sua máquina.
  2. Crie uma pasta para o seu projeto no meu caso D:\workspace\site-flask
  3. Abra o prompt de comando (Windows) ou bash (Linux/Git Bash)
  4. Entre na pasta onde estará o seu projeto
  5. Execute o comando o python -m venv venv
  6. Será criado um ambiente virtual isolado dentro da pasta venv
  7. 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
  8. Para sair do ambiente use o comando deactivate

Instalar flask

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

Criando o hello world

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.

Métodos http

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.

Visão geral sobre alguns métodos

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.

POST

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.

PUT

O método PUT substitui todas as atuais representações do recurso de destino pela carga de dados da requisição.

DELETE

O método DELETE remove um recurso específico.

Documentação da Mozilla sobre os métodos http

Registrando 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"

Link documentação do route

Como só podemos acessar o método GET pelo navegador é interessante baixar uma ferramenta para consumir os outros métodos http.

Request / Requisição

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

Formulários

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

Templates

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

# Tópicos
- Flask
- Jinja
- Werkzeug
- MVT - Model View Template
- view, response, render_template, url_for, redirect, session, request
- templates - extends, if, for, blocos
- Blueprints
- Flask Alquemy (ORM)
- Flask Migrate (Alembic)
- Flask WTF (WTForms)
- Flask Marshmallow
- Flasgger (Swagger)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment