Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problema após o Login no site da Jogoteca

Eu decidi refazer o site da jogoteca para praticar o que vi nas aulas e acabei descobrindo um erro no código que havia passado despercebido.

Estou tendo problemas no Login, quando coloco um usuario e senha que existem no banco de dados ele vai p /None, se eu clicar no voltar aparece o flash de 'usuario logado com sucesso!', já quando eu coloco um usuário que não existe recebo 'AttributeError AttributeError: 'NoneType' object has no attribute 'senha''

comparei meu código com o do Bruno e não consegui encontrar diferenças, meu codigo: https://github.com/bipex99/FlaskAlura2

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Olá Felipe, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Meus parabéns pela dedicação em ir além do proposto nas aulas. À medida que um projeto vai evoluindo pode surgir a necessidade de adicionarmos novas validações ou modificarmos validações já criadas. Para o projeto atual, será necessário modificarmos as validações e adicionar uma nova lógica de funcionamento na aplicação. Deixo abaixo uma explicação sobre os pontos que devemos modificar e os motivos.

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_projeto.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, já com a implementação.

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

Quanto ao erro de atributo levantado ao informarmos um usuário não cadastrado no banco de dados, está acontecendo devido à variável usuario receber o valor None no momento da tentativa de autenticação. Será necessário refatorar a rota /autenticar presente no arquivo views_projeto.py.

Adicionaremos primeiramente uma validação da variável usuario caso ela receba um valor (if usuario:), será feita a validação da variável senha (if senha:). Caso uma das duas validações não seja aceita, o usuário será redirecionado novamente para a página de /login.

Abaixo o código completo da rota /autenticar já com as mudanças necessárias.

@app.route('/autenticar', methods=['POST',])
def autenticar():
    form = FormularioUsuario(request.form)
    usuario = Usuarios.query.filter_by(nickname=form.nickname.data).first()
    if usuario:
        senha = check_password_hash(usuario.senha, form.senha.data)
        if senha:
            session['usuario_logado'] = usuario.nickname
            flash(usuario.nickname + ' Logado com Sucesso!')
            proxima_pagina = request.form['proxima']
            return redirect(proxima_pagina)

    flash('Usuário não logado')
    return redirect(url_for('login'))

Após realizar as mudanças acima, salve o arquivo views_projeto.py, inicie a aplicação e realize um novo login.

Resultado:

Início da transcrição. GIF Contendo a simulação de login em uma aplicação web. Nesse GIF é apresentada uma tela padrão de login com o fundo branco, contendo os campos nome e senha. Abaixo dos campos temos o botão login na cor azul e o botão voltar na cor vermelha. O usuário realiza três tentativas de login, a primeira tentativa usando nome e senha não cadastrados no banco de dados, a segunda tentativa usando nome cadastrado e senha errada. Nas duas tentativas o login não acontece, redirecionando o usuário para a página de login. A última tentativa o usuário informa um nome e senha cadastrado, conseguindo logar com sucesso. O GIF reinicia o lopp. Final da transcrição.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

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