3
respostas

problema com o login depois de implementar o url_for

Boa tarde, comparei meu codigo com o da aula e está identico, então nao seria problema no codigo

Primeiro problema é que se eu colocasse um usuario que nao existe dentro dos usuarios possiveis dava um stacktrace no site, resolvi adicionando elses no codigo nessa parte

@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 não logado')
            return redirect(url_for('login'))
    else:
        flash('Usuario não cadastrado')
        return redirect(url_for('login'))

Porém temos os seguintes erros com o url_for

Acessando diretamente "novo", sou redirecionado para seguinte url: http://127.0.0.1:5000/login?proxima=/novo

Se eu errar uma vez a senha e depois colocar a correta não sou redirecionado para a pagina de "novo" e obtenho o mesmo a seguir

se eu acessar o login diretamente, quando faço o login corretamente a minha url fica como "none" http://127.0.0.1:5000/None pq não vem um query string nesse caso

3 respostas

Resolvi uma parte colocando o redirect para a "proxima_pagina" com isso ele continua tentando acessar a pagina e quando acerto o login ele redireciona corretamente

@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']
            print(proxima_pagina)
            return redirect(proxima_pagina)          
        else:
            flash('Usuario não logado')
            proxima_pagina = request.form['proxima']
            print(proxima_pagina)
            return redirect(proxima_pagina)           
    else:
        flash('Usuario não cadastrado')
        proxima_pagina = request.form['proxima']
        print(proxima_pagina)
        return redirect(proxima_pagina) 

Só não sei como resolver para a pagina quando acesso o login diretamente não ficar "None" como mencionei

Resolvi dessa forma, não sei se a correta, mas agora está funcional, fiz a verificação se existe o "proxima_pagina" tanto dentro de "login" quanto no "autenticar"

from flask import Flask, render_template, request, redirect, session, flash, url_for

class Jogo:
    def __init__(self, nome, categoria, console):
        self.nome = nome
        self.categoria = categoria
        self.console = console


jogo1= Jogo('Tetris', 'Puzzle', 'Atari')
jogo2= Jogo('God of War', 'Rack n SLash', 'PS2')
jogo3= Jogo('Mortal Kombat', 'Luta', 'PS2')
lista = [jogo1, jogo2, jogo3]

class Usuario:
    def __init__(self, nome, nickname, senha):
        self.nome = nome
        self.nickname = nickname
        self.senha = senha

usuario1 = Usuario("Bruno Divino", "BD", "alohomora")
usuario2 = Usuario("Camila Ferreira", "Mila", "paozinho")
usuario3 = Usuario("Guilherme Louro", "Cake", "python_eh_vida")

usuarios = { usuario1.nickname : usuario1, 
             usuario2.nickname: usuario2,
             usuario3.nickname: usuario3}

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

@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')
    if proxima != None:
        return render_template('login.html', proxima=proxima)
    else:
        return render_template('login.html')

@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']
            if proxima_pagina:
                return redirect(proxima_pagina)
            else:
                return redirect(url_for('index'))          
        else:
            flash('Usuario não logado')
            proxima_pagina = request.form['proxima']
            if proxima_pagina:
                return redirect(proxima_pagina) 
            else:
                return redirect(url_for('login'))       
    else:
        flash('Usuario não cadastrado')
        proxima_pagina = request.form['proxima']
        if proxima_pagina:
            return redirect(proxima_pagina)
        else:
            return redirect(url_for('login'))  
    
@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Logout efetuado com sucesso!')
    return redirect(url_for('index'))

app.run(debug=True)

Oi Ian, tudo bem?

Ao revisar seu código, observei que você fez uma verificação para proxima_pagina em sua função autenticar:

proxima_pagina = request.form['proxima']
if proxima_pagina:
    return redirect(proxima_pagina)
else:
    return redirect(url_for('index'))

Isso é crucial, pois garante que, se proxima_pagina estiver definido, você será redirecionado para essa página após o login bem-sucedido. Caso contrário, você será redirecionado para a página inicial.

Então, você está no caminho certo ao implementar as funcionalidades de login e redirecionamento em sua aplicação Flask. As abordagens que você usou, como o uso de url_for e mensagens flash, estão corretas e alinhadas com as práticas recomendadas.

Obrigada por compartilhar com a gente as soluções encontradas.

Um abraço 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