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

[Bug] Pagina login nao esta redirecionando

Olá! A aplicação esta quase 100%, porem ao acessar diretamente a url /login e informar os dados de login a mesma nao é redirecionada, consegui identificar o problema mas nao encontrei solução, conto com a ajuda de vcs.

Quando acessamos a url /novo ela carrega um parametro proxima, o que nao acontece quando acessamos diretamente a url /login, sendo que a função autenticar redireciona para a variavel proxima_pagina que recebe valor do parametro proxima.

Resumindo, quando acessamos diretamento pela url /login esse variavel proxima_pagina esta vazia e por esse motivo a função autenticar não sabe pra onde redirecionar.

app = Flask(__name__)
app.secret_key = 'alura2022'

@app.route("/")
def index():
    return render_template('lista.html', titulo='Jogos', jogos=lista)

@app.route('/novo')
def novo():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('novo')))    <=====
    return render_template('novo.html', titulo='Novo Jogo')

@app.route('/criar', methods=['POST'])
def criar():
    nome = request.form['nome']
    categoria = request.form['categoria']
    console = request.form['console']
    jogo = Jogo(nome, categoria, console)
    lista.append(jogo)
    return redirect(url_for('index'))

@app.route('/login')
def login():
    proxima = request.args.get('proxima')
    return render_template('login.html', proxima=proxima)  <====

@app.route('/autenticar', methods=['POST'])
def autenticar():
    if request.form['usuario'] in usuarios:
        usuario = usuarios[request.form['usuario']]
        if request.form['senha'] == usuario.senha:
            session['usuario_logado'] = usuario.nickname
            flash(usuario.nickname + ' logado com sucesso!')
            proxima_pagina = request.form['proxima']
            return redirect(proxima_pagina)                                 <=====
        else:
            flash('Usuario ou senha invalidos')
            return redirect(url_for('login'))
    else:
        flash('usuário não logado')
        return redirect(url_for('login'))

@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Logout com sucesso!')
    return redirect(url_for('index'))

app.run(debug=True)

Att. Rafael

2 respostas
solução!

Olá Rafael, tudo bem com você?

Fico feliz que tenha levantado essa questão. Quando um usuário realiza o login acessando diretamente a rota /login, 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.

Para corrigir isso, podemos modificar a rota /autenticar para que um usuário consiga realizar o login acessando diretamente a rota /login. Para isso, sempre que um usuário não logado acessar a rota /login, ele será redirecionado para rota /index, após um login com sucesso.

Na rota /autenticar será adicionado uma verificação do valor salvo na variável proxima_pagina e caso seja "None" iremos atribuir a ela um novo valor, neste caso, url_for('index'), para redirecionar o usuário para a página inicial. Além disso, retiraremos a criação da variável proxima_pagina da verificação de usuário existente e a colocaremos no início da função, para que independemente se for um usuário válido ou não, o valor de proxima_pagina seja obtido.

No código abaixo é apresentado o código da rota /autenticar com as mudanças já implementadas.

@app.route('/autenticar', methods=['POST', ])
def autenticar():
    proxima_pagina = request.form['proxima']

    if request.form['usuario'] in usuarios:
        usuario = usuarios[request.form['usuario']]
        if request.form['senha'] == usuario.senha:
            session['usuario_logado'] = usuario.nickname
            flash(usuario.nome + ' logado com sucesso!')
            if proxima_pagina == "None":
                proxima_pagina = url_for('index')
            return redirect(proxima_pagina)

    flash('Usuário não cadastrado ou senha incorreta')
    return redirect(url_for('login', proxima=proxima_pagina))

No código acima, caso a condicional if não seja satisfeita iremos retornar a mensagem de Usuário não cadastrado ou senha incorreta.

Resultado:

Início da transcrição. GIF contendo a execução da tentativa e login no site jogoteca, o fundo da tela é branco contendo letras nas cores pretas. O usuário acessa o formulário de login, contendo dois campos, nome e senha, após o preenchimento usando uma senha errada o formulário é recarregado e é informado nome e senha corretas, neste momento o usuário é direcionado para  a página inicial. O GIF reinicia. Fim da transcrição.

Após adicionar o novo código para a rota de autenticação, salve o arquivo jogoteca.py e execute-o, acesse a rota http://127.0.0.1:5000/login e realize um novo acesso com um usuário cadastrado.

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!

Obrigado Felippe. abraço!

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