Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Pequeno erro ao logar

Estou com um pequeno problema na aplicação quando efetuado o login pois por algum motivo ele não encontra a rota do index quando coloco as credenciais. Ele efetua a autenticação, mas é preciso clicar no botão "voltar" que aí sim ele volta para o index e aparece o flash de login efetuado

views_user.py:

from jogoteca import app
from flask import render_template, request, redirect, session, flash, url_for
from models import Usuarios
from helpers import FormularioUsuario
from flask_bcrypt import check_password_hash
# Rota para login
@app.route('/login')
def login():
    proxima = request.args.get('proxima')

    #Instância da classe FormularioUsuario
    form = FormularioUsuario(request.form)

    # Enviando as informações da proxima página para login.html
    return render_template('login.html', proxima=proxima, form=form)

# Tora que de fato autentica e loga o usuário
@app.route('/autenticar', methods=['POST',])
def autenticar():
    #Instância da classe FormularioUsuario
    form = FormularioUsuario(request.form)

    # Caso exista algum nickname na tabela de Usuario que bata com o o nickname digitado pelo usuário, o resultado será salvo na variável (True or False)
    # .first() retorna o primeiro resultado
    usuario = Usuarios.query.filter_by(nickname=form.nickname.data).first()

    # Descriptografa e senha e a retorna
    senha = check_password_hash(usuario.senha, form.senha.data)

    # Verifica se o usuario existe na lista de usuários através do nickname
    if usuario and senha:
        # Verfica se a senha do usuário está correta
        # Salva o nickname do usuário dentro de session
        session['usuario_logado'] = usuario.nickname
        # Emite uma mensagem rápida e única
        flash(usuario.nickname + ' logado com sucesso!')
        proxima_pagina = request.form['proxima']
        return redirect(proxima_pagina)
    else:
        flash('Usuário não logado')
        return redirect(url_for('login'))

# Rota de logout
@app.route('/logout')
def logout():
    # Limpa a session e as credenciais do usuário atualmente logado
    session['usuario_logado'] = None
    flash('Logout efetuado com sucesso')
    return redirect(url_for('index'))

Se precisar do restante do código eu mando, pois não cabe nessa pergunta

4 respostas

Bom dia João! Tudo bem com você?

Para eu te ajudar melhor e conseguir simular o que está acontecendo no seu código, compartilhe seu projeto completo por favor. Pode compartilhar via drive ou Github e deixar o link na resposta, o que for mais prático para você.

Abraços!

Fico no aguardo e à disposição

Olá, bom dia!

Segue o link do repositório do no Github: https://github.com/JoaoxVictorMS/Jogoteca

solução!

Bom dia João, tudo bem?

Muito obrigado pelo retorno com o projeto completo. Realizei algumas simulações com o seu projeto, e o comportamento apresentado está relacionado com o código que define a rota /login. Deixo abaixo uma explicação detalhada do que está acontecendo e como realizar a correção.

No seu projeto atual, quando um usuário realiza o login acessando diretamente a rota /login, clicando no botão , a variável proxima_pagina receberá o valor None e este valor será enviado para a rota /autenticar que, após a autenticação realiza a tentativa de redirecionamento para a rota /None que não é válida, gerando o erro de página não encontrada (Not Found).

Para corrigir isso, devemos modificar a rota /login presente no arquivo views_user.py adicionando uma nova lógica de funcionamento na aplicação. Onde, sempre que um usuário não logado acessar a rota /login clicando no botão , ele será redirecionado para rota /index, após um login com sucesso.

No código abaixo adicionamos a verificação se a variável proxima possui valor igual à None, caso não possua, a variável próxima irá receber a url /index, indicando que o usuário será redirecionado para a página inicial após o login com sucesso.

if proxima == None:
        return render_template('login.html', proxima=url_for('index'), form=form)

Deixo abaixo o código completo da rota /login presente no arquivo views_user.py, já com a implementação.

@app.route('/login')
def login():
    proxima = request.args.get('proxima')
    form = FormularioUsuario(request.form)
    if proxima == None:
        return render_template('login.html', proxima=url_for('index'), form=form)
    return render_template('login.html', proxima=proxima, form=form)

Após realizar a mudança acima, salve o arquivo views_user.py, inicie a aplicação e realize um novo login clicando no botão . Deixo abaixo um GIF demonstrando o funcionamento do seu projeto após a implementação da correção ser aplicada.

GIF exibindo uma tela de login no navegador google chrome, o usuário realiza o login e é redirecionado para a página inicial

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá, bom dia! Muito obrigado pela ajuda e pela paciência! Deu certinho a solução.