2
respostas

[Bug] Erro na lógica da aula 6 - melhorando o fluxo de login

Nesta aula foi implementada a lógica para quando o usuário não estiver logado e tentar acessar a rota /novo a página redireciona para a rota /login com a próxima rota sendo a /novo após o usuário realizar o login.

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

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

jogo1 = Jogo('Enduro', 'Corrida', 'Atari')
jogo2 = Jogo('River Raid', 'Aeronave', 'Atari')
jogo3 = Jogo('Pitfall', 'Aventura', 'Atari')
jogos = [jogo1, jogo2, jogo3]

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

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

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

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

@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 'tete' == request.form['senha']:
        session['usuario_logado'] = request.form['usuario']
        flash(session['usuario_logado'] + ' Logado com sucesso!')
        proxima_pagina = request.form['proxima']
        return redirect(f'/{proxima_pagina}')
    else:
        flash('Usuário não logado!')
        return redirect('/login')

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

app.run(debug=True)

Porém se tentar realizar o login direto pela rota /login a url vai quebrar pois a variável proxima_pagina vai ser None

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

2 respostas

consegue mandar o projeto no github?

Olá!

A solução que eu encontrei foi no template, em caso de ausência da URL de redirecionamento (no meu caso chamei next_page), forçar para o login, em caso de sucesso, ir para a rota index como no exemplo abaixo: <input type="hidden" name="next_page" value="{{ next_page or url_for('index') }}">

Projeto completo de exemplo (primeiro e segundo curso prontos mais alguns recursos como o blueprint): https://github.com/foguinhoperuca/alura-flask/blob/master/auth/templates/user/login.html

[]'s