Notei que se eu não fizer logout e apenas fechar, independente do tempo que leve, se eu acessar a aplicação novamente eu estou logado. Como posso fazer para que a sessão expire e peça minhas credenciais novamente?
Notei que se eu não fizer logout e apenas fechar, independente do tempo que leve, se eu acessar a aplicação novamente eu estou logado. Como posso fazer para que a sessão expire e peça minhas credenciais novamente?
Oi Helio, como você está? Espero que esteja bem ^-^
Por padrão, o lifetime (tempo de vida) de uma sessão no flask são de 31 dias. Porém, podemos modificar esse tempo definindo a configuração de session.permanent
para True. Com isso conseguimos dizer a ele qual o tempo que aquela sessão permanecerá ativa através da propriedade permanent_session_lifetime
. Para isso iremos precisar importar a função timedelta
da biblioteca datetime
, pois com ela será possível definir o tempo exato da permanência da sessão:
from datetime import timedelta
E como a permanent_session_lifetime
é uma configuração do flask, podemos defini-la juntamente as nossas configurações de secret_key
por exemplo. Veja:
app.secret_key = 'alura'
app.permanent_session_lifetime = timedelta(seconds=10)
Nesse caso, dizemos que a sessão irá expirar com 10 segundos. E podemos ativar o tempo dessa sessão(session.permanent = True
) quando o usuário efetuar o login, no caso desse curso será na rota de autenticar
, pois é onde sabemos que o usuário foi logado com sucesso:
@app.route('/autenticar', methods=['POST', ])
def autenticar():
if request.form['usuario'] in usuarios:
usuario = usuarios[request.form['usuario']]
if usuario.senha == request.form['senha']:
session['usuario_logado'] = usuario.id
flash(usuario.nome + ' logou com sucesso!')
proxima_pagina = request.form['proxima']
print(proxima_pagina)
session.permanent = True
return redirect(proxima_pagina)
else:
flash('Não logado, tente novamente!')
return redirect(url_for('login'))
Já na rota de novo
podemos verificar se o usuário está com a sessão ativa ou não:
@app.route('/novo')
def novo():
if 'usuario_logado' not in session or session['usuario_logado'] == None:
flash("Você não está conectado. Refaça o login!")
return redirect(url_for('login', proxima=url_for('novo')))
return render_template('novo.html', titulo='Novo Jogo')
O comportamento esperado é que você faça o login e quando se passarem 10 segundos e for tentar acessar a rota \novo
tenha que fazer o login novamente, uma vez que a sessão foi expirada. 10 segundos é apenas um exemplo, você poderia definir dias, minutos, horas.
Deixo neste link o código completo do arquivo jogoteca.py
onde efetuei as mudanças. Utilizei o código final desse treinamento e fiz as mudanças mencionadas acima.
Qualquer dúvida seja na execução ou no entendimento é só falar, vamos conversando. Abraços e bons estudos!