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''
Alura Scuba TeamTime Alura | Apoio Educacional no Fórum
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.
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:
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!