1
resposta

Como posso fazer para sessão expirar?

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?

1 resposta

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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software