This repository has been archived by the owner on Mar 21, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
app.py
172 lines (131 loc) · 5.74 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# -*- coding: utf-8 -*-
'''
Esse projeto é um exemplo inicial de como usar Flask + SQLite.
O exemplo tem muitos pontos de melhoria que não foram explorados uma vez que o foco está em mostrar os conceitos fundamentais.
https://www.pythonsheets.com/notes/python-sqlalchemy.html
https://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html
Emerson Ribeiro de Mello - 2018
'''
from flask import (
redirect, render_template, request, session, url_for, Flask
)
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
# Chave usada para cifrar dados da sessão do usuário (e cookies) e assim evitar alguns tipos de ataque
# Deve ser escolhido um valor que não possa ser deduzido facilmente, até mesmo por força bruta. Nunca pode ser revelado para terceiros
SECRET_KEY = 'aula de BCD - string aleatória'
app = Flask(__name__)
app.secret_key = SECRET_KEY
# Fazendo Mapeamento objeto relacional (Object Relational Mapper - ORM) com engenharia reversa - refletion
engine = create_engine("sqlite:///lab05.sqlite")
Session = sessionmaker(bind=engine)
Base = automap_base()
Base.prepare(engine, reflect=True)
# Tabelas existentes no SQLite
Pessoa = Base.classes.Pessoa
Telefones = Base.classes.Telefones
@app.route('/')
def inicio():
return render_template('index.html')
@app.route('/listar')
def listar_pessoas():
sessionSQL = Session()
# Listando todas pessoas
pessoas = sessionSQL.query(Pessoa).all()
sessionSQL.close()
return render_template('listar.html', title='Listar', pessoas=pessoas)
@app.route('/editar', methods=['GET', 'POST'])
def editar():
sessionSQL = Session()
if request.method == 'GET':
# pegar o id da pessoa via GET (parâmetro id na URL)
pessoaId = str(request.args.get('id'))
pessoa = sessionSQL.query(Pessoa).filter(Pessoa.idPessoa == pessoaId).first()
if pessoa is None:
return redirect(url_for('listar_pessoas'))
telefones = sessionSQL.query(Telefones).filter(Telefones.idPessoa == pessoaId).all()
# adicionando id da pessoa na sessão do usuário
session['pessoaId'] = pessoaId
telIds = []
for tel in telefones:
telIds.append(tel.idTelefone)
# adicionando id dos telefones da pessoa na sessão
session['telefones'] = telIds
return render_template('editar.html', title='Editar pessoa', pessoa=pessoa)
else:
# obtendo ids que estavam na sessão
pessoaId = session['pessoaId']
telefones = session['telefones']
# limpando a sessão
session.pop('pessoaId', None)
session.pop('telefones', None)
# obtendo o novo valor que estava no campo 'nome' do formulário da página editar.html
nome = request.form['nome']
# buscando pela pessoa
pessoa = sessionSQL.query(Pessoa).filter(Pessoa.idPessoa == pessoaId).first()
# atualizando o nome da pessoa
pessoa.nome = nome
# atualizando os telefones da pessoa
for campo in request.form.items():
# o nome do campo no formulário está no formato: tele-IDTELEFONE
if 'tele-' in campo[0]:
# pegando somente o IDTELEFONE e descartando o tele-
idTelefone = campo[0].split('-')[1]
if (int(idTelefone)) in telefones:
for tel in pessoa.telefones_collection:
if tel.idTelefone == int(idTelefone):
tel.numero = campo[1]
continue
# persistindo os dados
sessionSQL.commit()
sessionSQL.close()
return redirect(url_for('listar_pessoas'))
@app.route('/excluir', methods=['GET', 'POST'])
def excluir():
sessionSQL = Session()
if request.method == 'GET':
# pegar o id da pessoa via GET (parâmetro id na URL)
pessoaId = str(request.args.get('id'))
pessoa = sessionSQL.query(Pessoa).filter(Pessoa.idPessoa == pessoaId).first()
if pessoa is None:
return redirect(url_for('listar_pessoas'))
# adicionando id da pessoa na sessão do usuário
session['pessoaId'] = pessoaId
return render_template('excluir.html', title='Excluir pessoa', pessoa=pessoa)
else:
# obtendo ids que estavam na sessão
pessoaId = session['pessoaId']
# limpando a sessão
session.pop('pessoaId', None)
# buscando pela pessoa
pessoa = sessionSQL.query(Pessoa).filter(Pessoa.idPessoa == pessoaId).first()
# excluindo seus telefones
pessoa.telefones_collection[:] = [] # limpando a lista vai refletir diretamente no DB
# excluindo a pessoa
sessionSQL.delete(pessoa)
# leia mais detalhes em https://docs.sqlalchemy.org/en/latest/orm/cascades.html
# ORM-level “delete” cascade vs. FOREIGN KEY level “ON DELETE” cascade
sessionSQL.commit()
sessionSQL.close()
return redirect(url_for('listar_pessoas'))
@app.route('/inserir', methods=['GET', 'POST'])
def inserir():
if request.method == 'GET':
return render_template('inserir.html', title='Adicionar pessoa')
else:
sessionSQL = Session()
# obtendo o novo valor que estava no campo 'nome' do formulário da página editar.html
nome = request.form['nome']
pessoa = Pessoa()
pessoa.nome = nome
# Criando um telefone estaticamente para uma nova pessoa
tel = Telefones()
tel.numero = '(48) 3210-1234'
pessoa.telefones_collection.append(tel)
sessionSQL.add(pessoa)
sessionSQL.commit()
sessionSQL.close()
return redirect(url_for('listar_pessoas'))
if __name__ == '__main__':
app.run(host="0.0.0.0",debug=True)