Flask Python Framework
Flask Python Framework
FRAMEWORK FLASK
Jonathas H. Miante
@campcodebrasil
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Introdução ao Flask
Flask é um framework web em Python que se destaca por sua simplicidade e flexibilidade. Criado
para ser fácil de entender e rápido para começar, Flask é a escolha ideal para desenvolvedores
que desejam construir aplicações web robustas sem a complexidade desnecessária.
Nesta apostila, vamos explorar os fundamentos do Flask, desde a configuração inicial até a
criação de aplicações web dinâmicas e interativas. Ao longo do caminho, vamos abordar
conceitos cruciais, como roteamento, templates, interação com bancos de dados e autenticação
de usuários
Sumário
2
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
3
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
1. Módulo Básico
Preparação do Ambiente:
Configuração do ambiente de desenvolvimento para Flask, incluindo a instalação do Flask,
criação de um ambiente virtual e configuração do ambiente de trabalho.
Arquivos Estáticos:
Utilização de arquivos estáticos, como CSS, JavaScript e imagens, para melhorar a apresentação
e a funcionalidade das páginas web.
Objetivos do Módulo:
• Estabelecer uma base sólida para o desenvolvimento web usando Flask.
• Capacitar os alunos a criarem uma estrutura de projeto organizada e eficiente.
• Entender a importância e aplicação dos arquivos estáticos e templates para a
construção de interfaces dinâmicas.
• Facilitar a comunicação entre o servidor e o navegador para exibir dados dinâmicos e
criar páginas dinâmicas.
4
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Preparação de Ambiente
Antes de tudo, é necessário ter o Python instalado. Flask é um framework web para Python. Você
pode verificar a presença do Python em seu sistema digitando python --version no terminal ou
prompt de comando. Caso não possua o Python instalado, pode obter o instalador no site oficial,
www.python.org/
Após instalado o Python, deve ser criado um ambiente virtual para seu projeto, para isso no
terminal digite o seguinte comando:
Com isso irá criar em seu projeto uma pasta chamada “.venv” contendo uma versão do python
e isolando as bibliotecas necessárias para seu projeto.
.venv\Scripts\activate
Instalando o Flask
5
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Na linha 1, estamos realizando a classe Flask do framework flask, será essa classe que será
responsável por instanciar nossa aplicação.
Na linha 3, estamos criando o aplicativo, é passado como parâmetro a variável __name__ que
serve para indicar que o nome da aplicação será o nome do arquivo py
Na linha 5, estamos definindo a rota para a view (entenderemos com mais detalhes no módulo
VIEW), no exemplo, estamos definindo a rota raiz da aplicação.
Na linha 7, estamos retornando o texto ‘Minha Primeira Página Flask’ para ser exibido quando a
aplicação estiver executando e a rota raiz for chamada
Na linha 9, estamos verificando se o arquivo que está sendo executado é o arquivo main.py, se
for irá seguir para linha 10
Na linha 10, estamos iniciando a aplicação, definindo como parâmetro o debug=True, que serve
para depurar o código, ou seja, sempre que houver uma alteração no código, a aplicação será
reiniciada.
6
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Estrutura de Arquivos
No exemplo acima, construímos uma aplicação Flask sem organizar na estrutura de um projeto
Flask, a partir de agora iremos começar a organizar essa estrutura.
O restante do projeto será incluso dentro de uma pasta com o nome da aplicação, ou podendo
chamar de “app”, dentro dessa pasta teremos a seguinte estrutura
• __init__.py - Arquivo responsável por inicializar o módulo, será incluso nele a construção
da aplicação flask
• form.py - Arquivo responsável por manter os formulários da aplicação
• models.py - Arquivo responsável por manter os modelos (comunicação com o banco de
dados) da aplicação
• routes.py - Arquivo responsável por manter as views da aplicação
• templates - Pasta responsável por manter os arquivos HTML
• static - Pasta responsável por manter os arquivos estáticos (css, img, js, etc...)
Um projeto Flask pode contre uma ou mais aplicações, para cada aplicação deve ser respeitado
a estrutura acima, mantendo uma pasta na raiz do projeto para cada aplicação.
Meu_projeto/
|-- app/
|-- |-- static/
|-- |-- |-- css/
|-- |-- |-- |-- style.css
|-- |-- templates
|-- |-- |-- base.html
|-- |-- |-- index.html
|-- |-- |-- about.html
|-- |-- __init__.py
|-- |-- form.py
|-- |-- models.py
|-- |-- routes.py
|-- main.py
7
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Estrutura MVC
O Flask não possui uma estrutura de MVC (Model-View-Controller) rígida como alguns outros
frameworks. No entanto, você pode aplicar conceitos semelhantes de organização do código
para alcançar uma separação de preocupações semelhante.
3. Na função da rota, pode ou não se comunicar com o Models (caso precise utilizar
algum dado que esteja armazenado em banco de dados)
8
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Para esse projeto, iremos construir um projeto já com a estrutura recomendada, ou seja,
vamos construir de acordo com o tópico anterior, para isso, vamos iniciar com os seguintes
passos:
1. Iniciando Projeto
Abra essa pasta com seu editor de código preferido, recomendamos o uso do PyCharm
ou VS Code
2. Preparando Projeto
app = Flask(__name__)
@app.route('/')
def homepage():
return render_template('index.html')
Após importamos o aplicativo app que está dentro do módulo app (criado na etapa
anterior)
9
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Primeiro Projeto Flask</title>
</head>
<body>
</body>
</html>
o HTML
o CSS
o JavaScript
app = Flask(__name__)
A importação das views deve ser realizada após a criação do app, pois as views
dependem do app para funcionar, caso seja importado antes, sua aplicação irá
“quebrar” pois estará com referência circular.
10
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
if __name__ == '__main__':
app.run(debug=True)
Agora podemos rodas o arquivo main.py, onde será inicializado o servidor, criando
assim nosso primeiro projeto Flask
projeto_basico/
|-- app/
|-- |-- templates
|-- |-- |-- index.html
|-- |-- __init__.py
|-- |-- routes.py
|-- main.py
11
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Função extends
A função extends serve para reutilizar um arquivo HTML, ou seja, podemos criar um arquivo base
e estender sua estrutura para outros arquivos, assim reduzindo drasticamente os códigos,
melhorando a manutenção.
Para isso, vamos copiar o conteúdo do arquivo index.html em um novo arquivo, chamado
base.html.
Após isso, vamos definir blocos onde poderá ser editado o conteúdo em outros arquivos, esses
blocos tem a seguinte sintaxe: {% block NOME_BLOCO %} CONTEÚDO DEFAULT {% endblock %}
No conteúdo default pode criar conteúdos, caso o bloco não seja chamado no arquivo que está
estendendo o código, o conteúdo padrão será exibido, esse conteúdo não é obrigatório,
podendo não possuir nenhum conteúdo.
No nosso arquivo base, vamos criar dois blocos, um para o título da pagina e outro para o
conteúdo da página.
Note que no bloco ‘title ‘ criamos um conteúdo padrão, com isso caso não “chamarmos” esse
bloco no arquivo que está estendendo o arquivo base, manteremos o padrão.
Quando “chamamos” o bloco, todo conteúdo default do bloco é apagado e substituído pelo que
você está incluindo no arquivo novo.
Agora vamos editar nosso arquivo index, removendo todos os conteúdos em comum com o base
e alterando o conteúdo do bloco ‘content’, o arquivo index.html ficará da seguinte forma:
Note que na primeira linha utilizamos a sintaxe {% extends 'base.html' %} que serve
para informarmos que esse arquivo irá estender o arquivo base.html
12
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Função include
Outra forma de reutilizar arquivos html é utilizando a função include, que serve para incluir o
conteúdo de outro arquivo html, para isso vamos criar um arquivo chamado lista.html, esse
arquivo irá conter uma lista das funcionalidades do flask no HTML que estamos aprendendo,
por hora iremos manter dois itens nessa lista, sendo as funções que acabamos de aprender.
Arquivo lista.html
Agora iremos incluir essa lista dentro do arquivo index.html, dentro do bloco contente iremos
incluir a seguinte linha:
{% include 'lista.html' %}
Isso fará que o conteúdo do arquivo lista.html seja incorporado no arquivo index.html
13
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Para trabalharmos com arquivos estáticos, devemos criar na pasta do projeto (app) uma pasta
se chamada ‘static’
Dentro dessa pasta, separamos os arquivos por categoria, uma pasta para cada, sendo img para
imagens, css para arquivos css e js para arquivos Javascript (essa abordagem não é obrigatória,
porém é uma boa prática)
Para o projeto que estamos construindo, vamos criar a pasta para arquivos de imagens e para
arquivos css, ficando com a seguinte estrutura de arquivos:
Note que já incluímos um arquivo em cada pasta, sendo na pasta css é um arquivo em branco,
onde estaremos incluindo algumas classes para o HTML estar utilizando e na pasta img, incluímos
um arquivo de imagem com o logo do Flask.
14
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Para utilizarmos arquivos estáticos, precisamos primeiro atualizar nosso arquivo de rotas,
incluindo a importação da função url_for
Após isso, vamos abrir o arquivo index.html e incluir o logo do flask, para isso, vamos incluir a
seguinte linha em nosso código:
<img src="{{ url_for('static', filename='img/flask.png') }}">
A tag img, informa que iremos incluir uma imagem no HTML e o atributo src é o local da imagem,
utilizamos o url_for para buscar o caminho do arquivo estático, passando como parâmetro o
nome da pasta e o nome do arquivo (incluindo a subpasta)
Resultado no navegador:
15
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Iremos incluir também o arquivo css, porém iremos fazer isso no arquivo base.html
16
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Uma das funcionalidades mais importantes em uma aplicação web é a capacidade de transmitir
dados do servidor (back-end) para o navegador do usuário (front-end). No Flask, isso pode ser
alcançado de várias maneiras, permitindo que dados dinâmicos sejam exibidos nas páginas da
web.
Para isso, dentro da função da rota, podemos criar a variável que iremos enviar para o
navegador (essa variável pode estar sendo recuperada de um banco de dados por exemplo)
Após criar a variável, vamos incluir no retorno do render_template, ficando com a função da
rota da seguinte forma:
No arquivo HTML, podemos recuperar o dado utilizando duas chaves, com o nome da
variável dentro das chaves, ex: {{ usuário }}
Para cada variável, temos que incluir no retorno, caso tenha muitas variáveis isso acaba
sendo inviável, uma solução é criar uma variável do tipo dicionário e para cada posição desse
dicionário é um dado que você precisa passar para o navegador.
Função da rota
17
18
Jonathas H. Miante
Index.html
Resultado:
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
2. APIs JSON
O Flask pode fornecer endpoints que respondem com dados no formato JSON. Isso permite que
o front-end faça solicitações AJAX para buscar dados dinâmicos.
O primeiro passo é criar uma rota para fornecer os dados para o HTML, para essa função iremos
utilizar o jsonify como retorno, para isso devemos importar essa função
19
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
No exemplo acima utilizamos uma rota para buscar dados através do Javascript, porém por
algum motivo, pode ser que a rota seja alterada (já o nome da função é mais difícil de acontecer),
com isso o ideal seria utilizar a rota dinâmica.
Para usar a rota dinâmica vamos utilizar a função url_for, sendo que o conceito é muito próximo
de usar arquivos estático.
De: fetch('/api/dados')
Nesse caso estamos recuperando os dados da rota através do nome da função dessa rota, assim
se alterarmos o caminho da rota, não haverá problema.
Essa alteração não terá nenhum impacto visual, pois estamos alterando o comportamento para
recuperar dinamicamente o caminho da rota.
Como boa prática, vamos estar utilizando essa abordagem sempre que precisarmos utilizar o
caminho da rota dentro do HTML.
Vale reforçar também que para utilizarmos a função url_for no HTML, o arquivo da rota deve ter
importado a função url_for (vimos isso quando aprendemos a trabalhar com arquivos estáticos)
20
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
As rotas com parâmetros no Flask são uma maneira poderosa de criar URLs dinâmicas que
podem aceitar valores variáveis. Isso é útil quando você precisa criar rotas que lidam com
diferentes recursos ou entidades com base em identificadores únicos.
Para criar uma rota com parâmetro, devemos adicionar na rota o nome da variável dentro dos
sinais <> e passar essa mesma variável como parâmetro da função, com isso conseguimos
trabalhar com esse dado dentro da função e retornando os dados desejados após tratados.
Para o exemplo, vamos criar uma rota que recebe um número em direto na rota e iremos dobrar
o valor, no navegador será exibido o número que está na rota e o valor dobrado.
routes.py
calcular.html
index.html
21
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Resultado Page
Ao clicar no botão “calcular Valor 50” será redirecionado para a rota /calcular/50
*** Note que na URL está com a rota /calcular/50, se alterarmos o valor de 50 para outro, o valor será alterado na página
dinamicamente
22
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
2. Módulo Intermediário
Segurança:
Garantir a segurança do aplicativo é essencial. Isso inclui proteger contra ataques comuns
como injeção de SQL, Criptografia de dados sensíveis e Cross-Site Request Forgery (CSRF).
O Flask oferece métodos e extensões para ajudar na segurança, como o Flask-SQLAlchemy para
proteger contra injeção de SQL e o Flask-WTF para prevenir CSRF.
Você pode criar, manipular e consultar dados utilizando o SQLite com a ajuda de extensões
como SQLAlchemy ou diretamente com o módulo SQLite3.
Models (Modelos):
Models representam a estrutura dos dados em um banco de dados. No Flask, eles são
implementados usando classes Python que interagem com o banco de dados.
Models são úteis para definir tabelas, relações entre os dados e realizar operações de leitura e
escrita.
Formulários:
O Flask-WTF (Flask-WTForms) é uma extensão comumente usada para lidar com formulários.
Ele simplifica a criação de formulários HTML e a validação de dados enviados pelo usuário.
Controle de Loop:
Vamos aprender implementar uma estrutura de Loop nos templates
Objetivos do Módulo:
• Compreender como integrar um banco de dados ao Flask usando SQLite.
• Criar e manipular modelos para representar dados de maneira estruturada.
• Utilizar formulários para coletar e validar dados dos enviados pelo usuário.
• Garantir a segurança do aplicativo aplicando práticas de segurança recomendadas.
23
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Banco de Dados
Vamos começar a configurar nosso banco de dados, para isso vamos precisar instalar duas novas
ferramentas, sendo:
Flask-SQLAlchemy: Será o ORM que iremos trabalhar, esse framework permite criarmos e
manipularmos o banco de dados diretamente do Python, através de classes.
Após instalado, vamos precisar configurar o banco de dados, vamos utilizar o SQLite, porém
também iremos aprender a conectar em banco de dados PostgreSQL e MySQL.
No arquivo __init__.py dentro da pasta app, vamos realizar algumas configurações, sendo:
24
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Com essas configurações, preparamos nosso projeto para acesso ao banco de dados SQLite
Para conectar um banco de dados PostgreSQL / MySQL, temos que fazer todos os passos
acima, a única diferença é que temos que instalar a biblioteca para conexão com o banco de
dados e a URI é um pouco diferente
25
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Models
Em Flask, os "models" se referem à representação das estruturas de dados que são mapeadas
em um banco de dados utilizando o SQLAlchemy ou outro ORM (Object-Relational Mapping).
Os models são classes Python que definem a estrutura das tabelas em um banco de dados
relacional.
Cada model representa uma tabela no banco de dados e os atributos da classe representam
colunas nessa tabela.
O próximo passo é iniciar as migrações, para isso precisamos digitar no terminal os seguintes
comandos:
2. Verificar as alterações no banco de dados e criar uma migração com base nas alterações
nos modelos (apenas os modelos importados no arquivo __init__.py sofrerão as atualizações)
flask db upgrade
Note que após executar os passos acima, será criado uma pasta chamada migrations e uma
chamada instance.
26
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Formulários
Os "forms" são estruturas que permitem criar e validar formulários de maneira mais conveniente
e segura. O Flask, por si só, não possui um módulo de formulários incorporado, mas muitos
desenvolvedores usam extensões como o Flask-WTF para lidar com formulários de maneira
eficiente.
Flask-WTF: É uma extensão que simplifica a criação e validação de formulários no Flask. Ele
facilita a geração de campos de formulário HTML e lida com a validação de dados submetidos.
Funcionamento Básico: Com Flask-WTF, você define classes Python para representar seus
formulários. Cada campo de entrada no formulário é representado por um atributo na classe do
formulário, e esses atributos são geralmente instâncias de classes de campos (como StringField,
IntegerField, etc.).
Proteção contra CSRF: O Flask-WTF ajuda a proteger os formulários contra ataques CSRF (Cross-
Site Request Forgery) adicionando automaticamente um campo de token CSRF aos formulários.
Antes de criarmos nosso primeiro Form, precisamos instalar a ferramenta flask_wtf, no terminal
vamos digitar a seguinte linha de comando:
Após vamos criar um arquivo chamado forms.py dentro da pasta app do projeto.
27
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Por último precisamos criar um secret_key para a validação do csrf_token, como esse dado é
extremamente sensível, não podemos deixa-lo exposto em nosso código, por isso vamos criar
um arquivo na raiz do nosso projeto, chamado local_settings.py, esse arquivo não pode ser
compartilhado publicamente, por exemplo se você estiver compartilhando seu projeto no
github. Certifique-se que esse arquivo seja configurado para não ser realizado upload.
Uma outra forma de trabalharmos com esse dado é utilizando uma variável de ambiente.
Para gerar uma chave aleatória secreta, podemos utilizar a biblioteca secrets, em um arquivo
python em branco digite o código:
Importe essa variável no arquivo __init__.py da pasta app e configure a Secret Key do APP
28
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Campos
Segue abaixo os principais campos do wtforms
Campo Descrição
StringField Campo de Texto Simples
IntegerField Campo de Números Inteiros
FloatField Campo de Números Decimais
BooleanField Campo de Valores Verdadeiro ou Falso
DateField Campo de Data
DateTimeField Campo de Data e Hora
SelectField Campo de Dropdown para Selecionar Opções
RadioField Campo de Seleção de Opções
TextAreaField Campo de Textos Multiplalinhas
FileField Campo de Arquivos
PasswordField Campo de Captura de Senhas
SubmitField Botão de Envio
Validações
Para utilizar os validators do wtforms.validators deve ser passado como parâmetro do campo
criado através do validators = [], onde cada item da lista deve ser um validator
Validator Descrição
DataRequired Garante que um campo não seja enviado em branco
Define limites para o tamanho de um campo
Length(min=x, max=y)
(mínimo e máximo)
Email Verifica se o campo possui um formato de e-mail válido
Garante que dois campos tenham valores iguais, útil para
EqualTo(fieldname)
campos de confirmação de senha
NumberRange(min=x, max=y) Limita os valores numéricos aceitáveis em um intervalo
Regexp(regex, message=None) Usa expressões regulares para validar o formato do campo
Verifica se o valor do campo está entre um conjunto
AnyOf(choices)
específico de valores
Garante que o valor do campo não esteja em um conjunto
NoneOf(values)
específico de valores
URL Verifica se o campo possui um formato de URL válido
Torna um campo opcional (não requerido). Se o campo
Optional
estiver vazio, a validação passa
FileAllowed(upload_set, Valida se o arquivo enviado pertence a um conjunto
message=None) específico de tipos permitidos
29
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Agora que já preparamos o banco de dados, o Models e o Forms, vamos implementar a rota e o
template para salvar as informações no banco de dados.
O primeiro passo, é criar uma rota para salvar os dados no banco de dados, por hora não vamos
nos preocupar com a lógica de salvar os dados, apenas vamos nos preocupar em adicionar o
formulário no navegador.
Nesse arquivo adicionamos o form com método POST, pois iremos trabalhar com envio de
informações para o servidor, sempre que trabalhamos com esse tipo de formulário, a primeira
informação que temos que adicionar dentro do FORM é o csrf_token.
Nas linhas 11 à 20 estamos incluindo os campos configurado no nosso form, podendo ser
passado como parâmetros do campo, os parâmetros do HTML.
*** Lembrando que não estamos preocupados nesse momento com o visual (Front-End) da
aplicação e sim com suas funcionalidades, caso desejem deixar o HTML mais agradável, fiquem
à vontade para fazer as alterações que desejarem
30
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Também vamos adicionar o link para essa nova rota no arquivo index.html
O formulário ainda não está funcionando, pois devemos configurar a rota para receber
solicitações do tipo POST e o que será feito com o formulário.
O próximo passo é configurar o arquivo form, incluindo a função save, para salvar as informações
no banco de dados.
Para isso precisamos importar a variável db do nosso app e criar a nova função do formulário
Também vamos importar o método redirect, para se tudo ocorrer certo, após salvar os dados a
página ser redirecionada
31
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Vamos realizar um teste, preencheremos um filme, ao clicar em salvar, se tudo ocorrer bem,
vamos ser redirecionados para a página inicial.
Em resumo, sempre que precisamos incluir dados no banco de dados, precisamos configurar:
32
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Antes de prosseguir para a próxima etapa, vamos melhorar um pouco nosso template, não
iremos nos aprofundar no tema, por isso recomendamos um estudo aprofundado no tema.
Para facilitar, não vamos construir os estilos do zero, vamos utilizar o framework front-end
bootstrap, para adicionar em nosso projeto precisamos alterar nosso arquivo base.html
base.html
Também iremos alterar o arquivo index.html, nesse arquivo vamos retirar os links e criar um
novo arquivo nav.html, que será responsável por manter os links, vamos inclusive incluir o nav
no arquivo base.html, assim surtindo efeito em todas as páginas de nosso projeto
nav.html
base.html
33
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
index.html
lista.html
filme_novo.html
Em resumo, utilizamos o framework bootstrap para estilizar nosso projeto, adicionando classes
para itens, assim deixando mais agradável.
34
35
Jonathas H. Miante
calcular.html
Resultado:
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Agora que apendemos a salvar informações em nosso banco de dados, precisamos aprender em
como recuperar e exibir para o usuário.
Vamos criar duas rotas para exibir os dados salvos, uma rota que irá listar todos os dados da
tabela e outra rota que irá exibir o detalhe, vamos iniciar com a rota para listar todos os dados.
Na linha 17 à 23, utilizamos o operador de loop com o Flask no HTML, onde estamos interagindo
todos os itens da lista objects
No Arquivo nav.html, vamos incluir duas rotas, uma para voltar para o início e uma para lista de
filmes
36
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Agora iremos criar a rota para exibir cada filme, para isso vamos criar uma rota detailFilme no
arquivo routes.py
Na linha 15 a 17, iniciamos um loop para criar uma linha para cada quebra de linha do resumo.
37
38
Jonathas H. Miante
Jonathas H. Miante
Módulo Avançado
Objetivo do Módulo
• Implementar controle de login para autenticação.
• Implementar controle de acesso para usuários autenticados.
• Implementar controle de logout
• Estrutura de decisão if no HTML
• Vincular registros a outras tabelas (FK)
• Tipo de dados de arquivos
• Trabalhar com Variáveis de Ambiente
• GitHub
• Deploy
Controle de Login
Vamos implementar o controle de login em nossa aplicação, assim podemos definir algumas
páginas somente usuários logados podem acessar, para isso vamos primeiro instalar a
ferramenta flask-login, flask-bcrypt e email_validator
__init__.py
39
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Após configurado o app, precisamos configurar o model de usuário e definir qual model pode
realizar o login, no arquivo models.py vamos importar a variável login_manager que criamos e
também vamos importar a classe UserMixin do flask_login
Vamos criar a classe User, definindo o UserMixin nessa classe, isso informa que essa classe será
utilizada para o login, também precisamos implementar uma função load_user para definir o
carregamento do usuário.
models.py
Precisamos fazer o migrate agora, para isso vamos digitar no shell o comando de migrate
flask db migrate
flask db upgrade
Agora vamos criar três rotas, uma para cadastro de novos usuários, uma para o login e outra para
o logout.
40
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Cadastro de Usuário
Vamos iniciar com o cadastro de usuário, primeiro vamos definir a classe no forms.py
Adicionamos a função para salvar o usuário no banco de dados e uma função para retornar o
usuário cadastrado
41
42
Jonathas H. Miante
Jonathas H. Miante
43
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
login.css
Também vamos remover a rota de calculo que usamos para aprender usar parâmetros nas rotas
44
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
45
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Uma outra estrutura muito importante é a tomada de decisão, podemos fazer isso no HTML
utilizando o flask, usando o seguinte bloco
{% if CONDIÇÃO %}
Bloco se verdadeiro
{% else %}
Bloco se falso
{% endif %}
Vamos implementar essa estrutura no arquivo nav, o que queremos fazer é, se o usuário não
estiver logado, vamos deixar visível a opção para cadastro e login, se estiver logado essas opções
não estarão disponíveis, mas ficará disponível a opção sair
46
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
No flask também existe um decorator que nos permite controlar o acesso a determinadas áreas
de nosso aplicativo para usuários que estejam logados, vamos incluir essa funcionalidade na rota
de cadastro de filmes, ou seja, apenas usuários que estejam logados poderão cadastrar novos
filmes.
Na rota que queremos adicionar essa funcionalidade devemos incluir após o app.route
Agora, um usuário que não esteja logado no sistema tentar entrar na página de cadastro, será
redirecionado para tela de login, assim enquanto não logar no sistema, não poderá acessar a
página com essa funcionalidade.
Agora vamos aprender em como criar relações entre tabelas, para isso vamos incluir uma nova
funcionalidade em nosso projeto, que será adicionar comentários nos filmes.
Adicionamos o tipo db.ForeignKey, que serve para informar que esse campo é um FK,
vinculando essa tabela com a tabela Filmes, no parâmetro passamos o nome da tabela todo
em minúsculo seguido do campo que estamos vinculando.
47
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
O campo “comentarios” serve para informar que temos uma relação com a tabela
“FilmeComentario”
Lembrando que sempre que realizarmos qualquer alteração no models devemos realizar os
procedimentos de migração
flask db migrate
flask db upgrade
Agora que já preparamos nosso banco de dados, precisamos criar o formulário para criar o
comentário, para isso vamos adicionar a seguinte função no arquivo forms
Nesse form, o único campo que será editado será o campo comentário, para a função save,
informamos qual o id do filme e id do usuário, assim criando os vínculos necessários
Agora precisamos criar a rota para adicionar o comentário, nesse caso, não vamos criar uma rota
específica, mas vamos editar a rota filme_detail, incluindo o formulário para esse campo.
48
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
49
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Para trabalharmos com arquivos no Flask, devemos primeiro alterar algumas configurações de
nosso app, vamos editar o arquivo __init__.py da pasta app
Incluímos o campo imagem, esse campo é do tipo texto, pois o que vamos gravar no banco de
dados não é a imagem em si, e sim apenas o seu nome, como default, vamos deixar o nome da
imagem padrão, que iremos incluir no próximo passo.
Lembrando que sempre que realizarmos qualquer alteração no models devemos realizar os
procedimentos de migração
flask db migrate
flask db upgrade
Agora vamos preparar as pastas e o arquivo padrão, dentro da pasta static vamos criar a pasta
data, dentro desta nova pasta vamos criar a pasta filmes e por fim dentro da pasta filmes vamos
incluir uma imagem com o nome ‘default.png’ que servirá para deixar quanto não ter uma
imagem definida.
Para garantir que o arquivo contenha um nome seguro, vamos importar a seguinte ferramenta:
E por fim importaremos a variável do nosso app para trabalharmos com a configuração da pasta
que definimos anteriormente
50
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Foi incluso o campo imagem, do tipo FileField e também alterado a função save da classe, agora
ao criar um filme precisamos definir onde será salvo a imagem e qual nome iremos salvar.
Para o nome, estamos usando a função secure_filename para modificar o nome do arquivo para
um nome seguro para o servidor.
O último passo agora é alterar o HTML do cadastro e o HTML para apresentação, vamos começar
com o do cadastro, ou seja o arquivo ‘filme_novo.html’.
51
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Agora vamos alterar o HTML para exibição, ou seja o arquivo ‘filme_detail.html’, onde vamos
adicionar as seguintes linhas de código para exibir as imagens.
52
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Variável de ambiente é uma forma segura de manter informações sigilosas, tais como
SECRET_KEYS, dados de acesso a banco de dados, entre outras informações.
Essas variáveis só existem no servidor que você cria, sendo assim, pode estar compartilhando o
código do APP, sem a preocupação de estar disponibilizando dados sensíveis, para trabalharmos
com essas informações vamos utilizar a biblioteca “os” que já vem instalado com o Python
Para definir uma variável de ambiente, podemos definir em nosso Sistema Operacional e
posteriormente no servidor, ou também podemos utilizar a biblioteca dotenv, assim podendo
criar a variável de sistema em um arquivo chamado ‘.env’, é claro que esse arquivo não deve ser
compartilhado, ele irá criar a variável de ambiente para o seu projeto, posteriormente devemos
criar as mesmas variáveis dentro do nosso servidor.
Vamos criar as variáveis de sistema para as variáveis que criamos no arquivo local_settings.py e
vamos estar excluindo esse arquivo.
Arquivo .env
53
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
GitHub
Instalação
54
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Criando Repositório
Acesse sua conta no github, e clique em New nas opções de repositório
Adicione um nome e altere apenas para public ou private, não faça nenhuma outra alteração,
pois queremos cirar um repositório em branco
55
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Crie um arquivo chamado .gitignore na raiz do projeto, esse arquivo servirá para definirmos o
que não irá ser realizado upload no github, vamos definir as seguintes configurações
Após criar o arquivo gitignore, vamos no terminal vamos digitar as instruções acima
56
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Na primeira vez, pode ser que solicite o login, irá abrir uma caixa de opções, selecione o login
pelo navegador e realize o login normalmente.
Atualizando Repositório
Sempre que realizar qualquer alteração no seu projeto, deverá atualizar o github, para isso
segue sempre os três passos abaixo:
Isso irá garantir que sempre o seu repositório no git estará com a última versão do seu código.
57
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Deploy
Antes de realizar o Deploy no Render, devemos instalar o biblioteca gunicorn, vamos instalar a
partir do pip, depois vamos atualizar o requirements.txt utilizando o comando:
Agora estamos preparados para realizarmos Deploy no Render, então devemos seguir os
seguintes passos:
1. Acesse o site https://render.com/ e crie uma conta (Recomendado criar a conta a partir
da conta do GitHub)
2. Acesse o Dashboard
58
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
7. Selecione a Região
Onde estamos informando que usaremos o gunicorn para renderizar nosso app,
utilizaremos o aplicativo app que criamos em nosso projeto seguido da variável app
59
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
12. Como o Render pode ter conflito de versão das bibliotecas, a partir do próximo passo,
devemos estar repetindo caso os passos abaixo (somente se acontecer o erro abaixo)
Nesse caso a biblioteca blinker não foi possível recuperar a versão 1.7.0, para
resolvermos isso, no nosso projeto no arquivo requirements.txt, vamos apagar a versão
dessa biblioteca, recomendo apagar a versão somente das bibliotecas que tiverem
incompatibilidade, para isso vamos repetir o processo abaixo até o deploy ser
completado
1. Verifique qual biblioteca retornou erro (no caso acima foi a blinker)
60
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
13. Para criar variáveis de ambiente no servido, devemos seguir os passos abaixo:
1. Clique em Environment
61
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Um problema que temos no Render é que ele não aceita o SQLite, então devemos incluir o
banco de dados POSTGRESQL, que inclusive ele tem na plataforma, porém precisamos adaptar
nosso projeto para o Postgres, vamos abaixo para o passo a passo:
1. Na criptografia do projeto, devemos adaptar para gravar no formato UTF-8, para isso
no forms na classe LoginForm e UserForm devemos realizar as seguintes alterações:
62
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
4.6. Em connections você poderá copiar a URL de acesso para o Banco de Dados, para
acessar do seu computador, deverá copiar a URL, External Database URL, ou seja, a sua
Variável de ambiente para conectar o banco de dados Render da sua máquina será
essa URL, para a Variável direto no servidor Render, deverá ser a URL, Internal
Database URL
4.6. Após copiar os dados da External Database, abra seu arquivo local e altere a
variável de ambiente de conexão com o banco de dados
4.8. Rode as migrate do banco de dados para construir, esse processo deve ser rodado
na primeira vez que conectar ao banco de dados e sempre que houver alterações nos
modelos
flask db upgrade
63
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Podendo ser acessado por qualquer pessoa pelo link do seu projeto
*** Um outro problema que temos com a opção gratuita é na atualização de nosso APP, os
arquivos estáticos acabam sendo resetados para o padrão, então se você trabalha com UPLOAD
de arquivos acaba perdendo esses arquivos, na opção paga, existe como configurar a pasta que
não será apagada nas atualizações, assim mantendo os arquivos.
64
Licenciado para - Bruno Joan Fonseca Pereira - 10133455335 - Protegido por Eduzz.com
Jonathas H. Miante
Utilizando CPanel
No arquivo __init__.py do app, adicione a linha abaixo antes das importação das rotas
Apague todos os dados da pasta criada no servidor e suba os dados do seu projeto, entre no
CPanel novamente e instale as bibliotecas, adicionando o requirements.txt
65