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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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 timedeltaE 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!