1
resposta

A url está recebendo a rota /None

Olá. Eu estava tendo o mesmo problema que o Sálvio descreveu nesse tópico: https://cursos.alura.com.br/forum/topico-tipo-none-e-passado-para-a-variavel-proxima_pagina-quando-tento-acesso-direto-pela-url-login-212214 Percebi que o valor da input proxima está recebendo o valor 'None' quando faço o login normalmente (sem ser proveniente da rota novo) O que fiz para solucionar esse problema foi o seguinte:

@app.route('/autenticar', methods=['POST'])
def autenticar():
    pasw = request.form['pasw']
    if pasw == 'Senha':
        session['usuario_logado'] = request.form['user']
        proxima_pagina = request.form['proxima']
        if proxima_pagina == 'None':
            proxima_pagina = "/"
        return redirect(proxima_pagina)

Essa é a melhor forma de corrigir esse problema?

Meu código python completo é:

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

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

@app.route('/')
def index():
    return '<p>index<p>'

@app.route('/comentario')
def comentario():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('comentario')))
    else:
        return '<p>comentario<p>'

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

@app.route('/autenticar', methods=['POST'])
def autenticar():
    pasw = request.form['pasw']
    if pasw == 'Senha':
        session['usuario_logado'] = request.form['user']
        proxima_pagina = request.form['proxima']
        if proxima_pagina == 'None':
            proxima_pagina = "/"
        return redirect(proxima_pagina)
    else:
        flash('Algo deu errado na sua autenticação.')
        return redirect('/login')


@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    return redirect('/login')

if __name__ == '__main__':
    app.run(debug = True)

Meu código html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css">
    <link rel="stylesheet" href="{{ url_for('static', filename='login.css') }}">
</head>
<body>
    <div class = 'container-fluid centralize'>
        <div class="card text-white bg-dark">
            <form method="post" action="/autenticar">
                <input type="hidden" name="proxima" value="{{ proxima }}">
                <p>Login</p>
                <br/>
                <div class="container">

                    <div class="row">
                        <div class="col-4">
                            <label>Usuário:</label>
                        </div>
                        <div class="col-8">
                            <input name="user">
                        </div>
                    </div>

                    <div class="row">
                        <div class="col-4">
                            <label>Senha:</label>
                        </div>
                        <div class="col-8">
                            <input name="pasw">
                        </div>
                    </div>

                    {% with messages = get_flashed_messages() %}
                        {% if messages %}
                            <ul id="messages" class="list-unstyled">
                            {% for message in messages %}
                                <li class="text-danger">{{ message }}</li>
                            {% endfor %}
                            </ul>
                        {% endif %}
                    {% endwith %}

                    <br/>

                    <div class="row centralize">
                        <input type="submit" value="Pronto" style="width: 70px">
                    </div>
                </div>
            </form>
        </div>
    </div>
</body>
</html>
1 resposta

Olá Henrique! Tudo certo? Espero que sim. 🙂

Primeiramente, quero me desculpar pelo atraso na resposta.

Boa solução!

Uma outra alternativa de lidar com esse bug seria alterar o código de login.html e mudar a tag de input tipo hidden, para oferecer uma alternativa caso a variável proxima tenha um valor igual a None:

O código antigo:

<input type="hidden" name="proxima" value="{{ proxima }}">

O novo código:

<input type="hidden" name="proxima" value="{{ proxima or url_for('index') }}">

Espero ter ajudado! Quaisquer dúvidas, estou à disposição. 😉

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